POJ2676-Sudoku

孤人 提交于 2020-04-06 18:14:30

不得不说,这道题真的不难........

【题目描述】

数独是一项非常简单的任务。如图所示,具有9行和9列的方形表被分成9个较小的正方形3x3。在一些单元格中写入从1到9的十进制数字。其他单元格为空。目标是用1到9的十进制数字填充空单元格,每个单元格一个数字,这样在每行,每列和每个标记的3x3子方格中,所有数字从1到9出现。编写程序来解决给定的Sudoku任务。 

【输入】

输入数据将以测试用例的数量开始。对于每个测试用例,后面跟着9行,对应于表的行。在每一行上给出一串精确的9位十进制数字,对应于该行中的单元格。如果单元格为空,则表示为0。

【输出】

对于每个测试用例,您的程序应以与输入数据相同的格式打印解决方案。必须根据规则填充空单元格。如果解决方案不是唯一的,则程序可以打印其中任何一个。

【输入示例】

1
103000509
002109400
000704000
300502006
060000050
700803004
000401000
009205800
804000107

【输出示例】

143628579
572139468
986754231
391542786
468917352
725863914
237481695
619275843
854396127

 

这道题可以说除了判断九宫格没啥难点。((i-1)/3*3+(j-1)/3+1)

对了,那些ans是指数字有没有在此行此列中出现过。

放代码,哈欠~~~~

  1 #include<iostream>
  2 #include<cstring>
  3 using namespace std;
  4 int a[1100][1100];
  5 int ans1[1100][1100],ans2[1100][1100],ans3[1100][1100];
  6 int n;
  7 bool k=0;
  8 void put(int x,int y) 
  9 {
 10     if(k==1)
 11     {
 12         return ;
 13     } 
 14     if(a[x][y]!=0) 
 15     {
 16         if(x==9&&y==9) 
 17         {
 18             for(int i=1; i<=9; i++) 
 19             {
 20                 for(int j=1; j<=9; j++) 
 21                 {
 22                     cout<<a[i][j];
 23                 }
 24                 cout<<endl;
 25             }
 26             k=1;
 27             cout<<endl;
 28             return ;
 29         }
 30         if(y==9) 
 31         {
 32             put(x+1,1);
 33         } 
 34         else 
 35         {
 36             put(x,y+1);
 37         }
 38     }
 39     if(a[x][y]==0) 
 40     { 
 41         for(int i=1; i<=9; i++) 
 42         {
 43             if(ans1[x][i]==0&&ans2[y][i]==0&&ans3[(x-1)/3*3+(y-1)/3+1][i]==0) 
 44             {  
 45                 a[x][y]=i;
 46                 ans1[x][i]=1;
 47                 ans2[y][i]=1;
 48                 ans3[(x-1)/3*3+(y-1)/3+1][i]=1;
 49                 if(x==9&&y==9) 
 50                 {
 51                     for(int i=1; i<=9; i++) 
 52                     {
 53                         for(int j=1; j<=9; j++) 
 54                         {
 55                             cout<<a[i][j];
 56                         }
 57                         cout<<endl;
 58                     }
 59                     k=1;
 60                     cout<<endl;
 61                     return ;
 62                 }
 63                 if(y==9)
 64                 {
 65                     put(x+1,1);
 66                 }  
 67                 else 
 68                 {
 69                     put(x,y+1);
 70                 }
 71                 a[x][y]=0;
 72                 ans1[x][i]=0;
 73                 ans2[y][i]=0;
 74                 ans3[(x-1)/3*3+(y-1)/3+1][i]=0;
 75             }
 76         }
 77     }
 78 }
 79 int main() {
 80     cin>>n;
 81     for(int l=1; l<=n; l++) 
 82     {
 83         memset(ans1,0,sizeof(ans1));
 84         memset(ans2,0,sizeof(ans2));
 85         memset(ans3,0,sizeof(ans3));
 86         for(int i=1; i<=9; i++) 
 87         {
 88             for(int j=1; j<=9; j++) 
 89             {
 90                 char ch;
 91                 cin>>ch;
 92                 a[i][j]=ch-'0';
 93                 if(a[i][j]>0) 
 94                 {
 95                     ans1[i][a[i][j]]=1;
 96                     ans2[j][a[i][j]]=1;
 97                     ans3[(i-1)/3*3+(j-1)/3+1][a[i][j]]=1;
 98                 }
 99             }
100         }
101         k=0;
102         put(1,1);
103     }
104 }

好了,还有题等着我,拜~~

 

在暴风雨中低着头,是为了不让雨水模糊风雨后眼中的彩虹。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!