今天遇到了数独题,记得曾经见过,但是第一感觉太复杂掠过去,今天发现了其中不少的问题,搜索的时候 那个点带进值的时候要试一下合不合适,每一行,每一列的还比较好说,重要的是,在小的九方格 里的判断。下标 x和y, 九方格左上角的下标是x-x%3, y-y%3 。真的困在这个数独题上还是 好久。
今天还遇到一道 不太一样搜索题,搜索的带有方向
链接 ,最短路径的很简单,最主要的是 向右,和向左走的方向问题。
code:
#if 0
#include<iostream>
using namespace std;
int a[15][15],cnt;
bool flag=0;
int ok(int x,int y,int k)
{
for(int i=0; i<9; i++)
{
if(a[x][i]==k)
return 0;
if(a[i][y]==k)
return 0;
}
int sx=x-x%3;
int sy=y-y%3;
for(int i=sx; i<sx+3; i++)
{
for(int j=sy; j<sy+3; j++)
{
if(a[i][j]==k)
return 0;
}
}
return 1;
}
void dfs(int num)
{
bool flag1=0;
int x,y;
if(num==cnt)
{
for(int i=0; i<9; i++)
{
for(int j=0; j<9; j++)
{
cout<<a[i][j];
}
cout<<endl;
}
flag=1;
return;
}
if(flag)
return;
for(int i=0; i<9; i++)
{
for(int j=0; j<9; j++)
{
if(a[i][j]==0)
{
flag1=1;
x=i;y=j;
break;
}
}
if(flag1)
break;
}
for(int k=1; k<=9; k++)
{
if(ok(x,y,k))
{
a[x][y]=k;
dfs(num+1);
a[x][y]=0;
}
}
}
int main()
{
int N;
char c;
cin>>N;
while(N--)
{
flag=0;
cnt=0;
for(int i=0; i<9; i++)
{
for(int j=0; j<9; j++)
{
cin>>c;
a[i][j]=c-'0';
if(a[i][j]==0)
cnt++;
}
}
dfs(0);
}
}
#endif