p1335 数独验证

Posted archemiya

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了p1335 数独验证相关的知识,希望对你有一定的参考价值。

描述
具体规则如下:
每一行都用到1,2,3,4,5,6,7,8,9,位置不限,
每一列都用到1,2,3,4,5,6,7,8,9,位置不限,
每3×3的格子(共九个这样的格子)都用到1,2,3,4,5,6,7,8,9,位置不限,
游戏的过程就是用1,2,3,4,5,6,7,8,9填充空白,并要求满足每行、每列、每个九宫格都用到1,2,3,4,5,6,7,8,9。

如下是一个正确的数独:
5 8 1 4 9 3 7 6 2
9 6 3 7 1 2 5 8 4
2 7 4 8 6 5 9 3 1
1 2 9 5 4 6 3 7 8
4 3 6 1 8 7 2 9 5
7 5 8 3 2 9 1 4 6
8 9 2 6 7 1 4 5 3
6 1 5 9 3 4 8 2 7
3 4 7 2 5 8 6 1 9

格式
输入格式
输入n个数独,你来验证它是否违反规则.
第一行为数独个数,第二行开始为第一个数独,之后为第二个,至第n个.
注意!每个数独之间有一个回车隔开!

输出格式
若正确则输出”Right”若不正确则输出”Wrong” 输出一个换一行

样例1
样例输入1
2
5 8 1 4 9 3 7 6 2
9 6 3 7 1 2 5 8 4
2 7 4 8 6 5 9 3 1
1 2 9 5 4 6 3 7 8
4 3 6 1 8 7 2 9 5
7 5 8 3 2 9 1 4 6
8 9 2 6 7 1 4 5 3
6 1 5 9 3 4 8 2 7
3 4 7 2 5 8 6 1 9

1 2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9 1
3 4 5 6 7 8 9 1 2
4 5 6 7 8 9 1 2 3
5 6 7 8 9 1 2 3 4
6 7 8 9 1 2 3 4 5
7 8 9 1 2 3 4 5 6
8 9 1 2 3 4 5 6 7
9 1 2 3 4 5 6 7 8
样例输出1
Right
Wrong

思路
每行每列每块分开模拟。

代码

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 int main(){
  5     int i,n,a[10][10],j,k;
  6     scanf("%d",&n);
  7     for(k=1;k<=n;k++){
  8         int e=1;
  9         for(i=1;i<=9;i++){
 10             for(j=1;j<=9;j++){
 11                 scanf("%d",&a[i][j]);
 12             }
 13         }
 14         if(k!=n)
 15             getchar();
 16         for(i=1;i<=9;i++){
 17             int b[10]={0};
 18                 b[0]=1;
 19             for(j=1;j<=9;j++){
 20                 if(b[a[i][j]]==0)
 21                     b[a[i][j]]=1;
 22                 else{
 23                     printf("Wrong\n");
 24                     e=0;
 25                     break;
 26                 }
 27             }
 28             if(e==0)
 29                 break;
 30         }
 31         if(e==0)
 32             continue;
 33         for(j=1;j<=9;j++){
 34             int b[10]={0};
 35                 b[0]=1;
 36             for(i=1;i<=9;i++){
 37                 if(b[a[i][j]]==0)
 38                     b[a[i][j]]=1;
 39                 else{
 40                     printf("Wrong\n");
 41                     e=0;
 42                     break;
 43                 }
 44             }
 45             if(e==0)
 46                 break;
 47         }
 48         if(e==0)
 49             continue;
 50         for(i=2;i<=8;i=i+3){
 51             for(j=2;j<=8;j=j+3){
 52                 int b[10]={0};
 53                 b[0]=1;
 54                 if(b[a[i][j]]==0)
 55                     b[a[i][j]]=1;
 56                 else
 57                     e=0;
 58                 if(b[a[i-1][j-1]]==0)
 59                     b[a[i-1][j-1]]=1;
 60                 else
 61                     e=0;
 62                 if(b[a[i][j-1]]==0)
 63                     b[a[i][j-1]]=1;
 64                 else
 65                     e=0;
 66                 if(b[a[i-1][j]]==0)
 67                     b[a[i-1][j]]=1;
 68                 else
 69                     e=0;
 70                 if(b[a[i+1][j]]==0)
 71                     b[a[i+1][j]]=1;
 72                 else
 73                     e=0;
 74                 if(b[a[i][j+1]]==0)
 75                     b[a[i][j+1]]=1;
 76                 else
 77                     e=0;
 78                 if(b[a[i+1][j+1]]==0)
 79                     b[a[i+1][j+1]]=1;
 80                 else
 81                     e=0;
 82                 if(b[a[i-1][j+1]]==0)
 83                     b[a[i-1][j+1]]=1;
 84                 else
 85                     e=0;
 86                 if(b[a[i+1][j-1]]==0)
 87                     b[a[i+1][j-1]]=1;
 88                 else
 89                     e=0;
 90                 if(e==0)
 91                     break;
 92             }
 93             if(e==0)
 94             break;
 95         }
 96         if(e!=0)
 97             printf("Right\n");
 98         else
 99             printf("Wrong\n");
100     }
101     return 0;
102 }

 

以上是关于p1335 数独验证的主要内容,如果未能解决你的问题,请参考以下文章

基于SAT的数独游戏求解程序,求C语言代码

操作系统作业数独解决方案验证器(利用多线程解决)

Vijos 数独验证

[模拟]验证数独

LeetCode题目--有效的数独(python/Java实现)

36.有效的数独