首页 > 学院 > 开发设计 > 正文

skudo数独问题

2019-11-14 12:38:34
字体:
来源:转载
供稿:网友

There is really only one rule:

Fill in the grid so thatevery row,every column, andevery 3 x 3 boxcontains the digits 1 through 9.这个游戏只有一个规则:将格子填满使得每一行,每一列,和每一个小的九宫格恰好包含1-9这9个数字正是由于规则简单而又变化多端,数独一时间风靡全球。现在,我们希望你能编写一个程序解决数独问题。

输入格式:

输入数据一共9行,每行有9个字符。输入数据描述了一个待解决的数独,其中,“?”表示数独中的空缺。我们的输入数据总保证有唯一解。

输出格式:

输出一共9行,每行9个数字,表示你的答案。

样例输入:

5????7??6?6????5?4?834????????182?4???1???9???7?369????????543?1?5????9?7??2????1

样例输出:

514927386967831524283456179659182743321574968478369215892615437135748692746293851

时间限制:

1000

空间限制:

32768有时间再写一个dancinglinks。  读入很难,大家仔细体会一下。还可以加一个优化就是按每个格子已排除的数的个数从小到大排序后再搜。codevs上用inti()读入,输出时加一个空格#include<bits/stdc++.h>using namespace std;int n,m;int sz[10][10];int heng[10][10],shu[10][10],jiu[4][4][10];void init(){int count=0;while (count<81){bool pg=0;char c;scanf("%c",&c);if (c=='?') count++;if(c>='1'&&c<='9'){count++;sz[(count-1)/9+1][count-((count-1)/9+1)*9+9]=c-'0';}}}void inti(){cin>>n;int xx,yy,zz;for(int i=1;i<=n;i++){cin>>xx>>yy>>zz;sz[xx][yy]=zz;}}void inin(){for(int i=1;i<=9;i++)for(int j=1;j<=9;j++)cin>>sz[i][j];}void PRepare(){for(int i=1;i<=9;i++)for(int j=1;j<=9;j++){heng[i][sz[i][j]]+=1;shu[j][sz[i][j]]+=1;jiu[((i-1)/3)+1][((j-1)/3)+1][sz[i][j]]+=1;}}//READYvoid print(){for(int i=1;i<=9;i++){for(int j=1;j<=9;j++)cout<<sz[i][j];cout<<"/n";}}void dfs(int depth){if(depth>81) {print();return;}int x=(depth-1)/9+1,y=depth-x*9+9;int aa=(x-1)/3+1;int bb=(y-1)/3+1;if(sz[x][y]) {dfs(depth+1);return;}for(int i=1;i<=9;i++){if(heng[x][i]||shu[y][i]||jiu[aa][bb][i])continue;heng[x][i]++;shu[y][i]++;jiu[aa][bb][i]++;sz[x][y]=i;dfs(depth+1);heng[x][i]--;shu[y][i]--;jiu[aa][bb][i]--;sz[x][y]=0;}}void doit(){dfs(1);}int main(){init();//inti();// inin();prepare();doit();}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表