Vijos p1335 数独验证

背景
XX学校风靡一款智力游戏,也就是数独(九宫格),先给你一个数独,并需要你验证是否符合规则。

描述
具体规则如下:
每一行都用到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
输入
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

输出
Right
Wrong

 

思路

按题意模拟

 

代码

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 
 5 int isLineRight(int);
 6 int isRowRight(int);
 7 int isCellRight(int,int);
 8 int a[9][9];
 9 
10 int main() {
11     int i,j,k,n,flag;
12     scanf ("%d",&n);
13     for (k=0;k<n;k++) {
14         flag=1;
15         for (i=0;i<9;i++) {
16             for (j=0;j<9;j++) {
17                 scanf ("%d",&a[i][j]);    
18             }    
19         }    
20         for (i=0;i<9;i++) {
21             if (!isLineRight(i)) {
22                 flag=0;
23                 break;
24             }    
25         }
26         for (i=0;i<9;i++) {
27             if (!isRowRight(i)) {
28                 flag=0;
29                 break;    
30             }    
31         }
32         for (i=0;i<9;i=i+3) {
33             for (j=0;j<9;j=j+3) {
34                 if (!isCellRight(i,j)) {
35                     flag=0;
36                     break;    
37                 }    
38             }    
39             if (!flag) break;
40         }
41         if (flag) printf ("Right\n");
42         else printf ("Wrong\n");
43     }
44     system("pause");
45     return 0;
46 }
47 
48 int isLineRight(int row) {
49     int i;
50     int b[10];  //b[1-9] 所以要b[10] 
51     memset (b,0,sizeof(b));
52     for (i=0;i<9;i++) {
53         b[a[row][i]]++;
54     }
55     for (i=1;i<=9;i++) {
56         if (b[i]==0) return 0;
57     }
58     return 1;
59 }
60 
61 int isRowRight (int line) {
62     int i;
63     int b[10];
64     memset (b,0,sizeof(b));
65     for (i=0;i<9;i++) {
66         b[a[i][line]]++;
67     }
68     for (i=1;i<=9;i++) {
69         if (b[i]==0) return 0;
70     }
71     return 1;
72 }
73 
74 int isCellRight (int l, int r) {
75     int i,j;
76     int b[10];
77     memset (b,0,sizeof(b));
78     for (i=l;i<l+3;i++) {
79         for (j=r;j<r+3;j++) {
80             b[a[i][j]]++;    
81         }
82     }
83     for (i=1;i<=9;i++) {
84         if (b[i]==0) return 0;
85     }
86     return 1;
87 }

 

posted @ 2018-02-27 00:29  yachen2018  阅读(303)  评论(0编辑  收藏  举报