叔叔提了個數獨的問題,據說是最難九宮格,並提議我和弟弟考慮編程實現,貼一下我的代碼
#include <iostream>
#include <bits/stdc++.h>
#define N 9
using namespace std;
vector<vector<bool> >vis(N,vector<bool>(N));
void print(vector<vector<int> >grid)
{
cout<<endl;
for(int i = 0;i<N;i++)
{
for(int j = 0;j<N;j++)
{
cout<<grid[i][j]<<" ";
}
cout<<endl;
}
}
bool judge(int t_i,int t_j,vector<vector<int> >grid)
{
for(int i = 0;i<N;i++)
{
if(i!=t_i && grid[t_i][t_j] == grid[i][t_j]) return false;
}
for(int j = 0;j<N;j++)
{
if(j!=t_j && grid[t_i][t_j] == grid[t_i][j]) return false;
}
int block_i = (t_i/3)*3;
int block_j = (t_j/3)*3;
for(int i = 0;i<3;i++)
{
for(int j = 0;j<3;j++)
{
if(!(block_i+i == t_i && block_j+j == t_j) && grid[block_i+i][block_j+j] == grid[t_i][t_j]) return false;
}
}
return true;
}
void dfs(int n,vector<vector<int> >grid)
{
if(n == N*N)
{
cout<<endl;
cout<<"The answer is :"<<endl;
for(int i = 0;i<N;i++)
{
for(int j = 0;j<N;j++)
{
cout<<grid[i][j]<<" ";
}
cout<<endl;
}
return;
}
else
{
int t_i = n/N;
int t_j = n%N;
if(vis[t_i][t_j]) dfs(n+1,grid);
else
{
for(int i = 1;i<=N;i++)
{
grid[t_i][t_j] = i;
if(judge(t_i,t_j,grid))
{
//print(grid);
dfs(n+1,grid);
}
}
}
}
}
int main()
{
vector<vector<int> >grid(N,vector<int>(N));
for(int i = 0;i<N;i++)
{
for(int j = 0;j<N;j++)
{
cin>>grid[i][j];
vis[i][j] = !(!grid[i][j]);
}
}
dfs(0,grid);
return 0;
}
/**
8 0 0 0 0 0 0 0 0
0 0 3 6 0 0 0 0 0
0 7 0 0 9 0 2 0 0
0 5 0 0 0 7 0 0 0
0 0 0 0 4 5 7 0 0
0 0 0 1 0 0 0 3 0
0 0 1 0 0 0 0 6 8
0 0 8 5 0 0 0 1 0
0 9 0 0 0 0 4 0 0
**/