您的位置:首页 > 其它

训练总结8.4

2017-08-04 22:50 120 查看
今天遇到了数独题,记得曾经见过,但是第一感觉太复杂掠过去,今天发现了其中不少的问题,搜索的时候 那个点带进值的时候要试一下合不合适,每一行,每一列的还比较好说,重要的是,在小的九方格 里的判断。下标 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: