TYVJ P1093 验证数独 Label:none

背景

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

输入


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<=n<=20 (输入的数独个数)
不论输入的数独是错误的还是正确的,数据都保证每个数在1-9之间,即只会出现因为有相同的数而导致违反规则,而不会因为数字超出了1-9的范围而违反规则.

代码

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int a[10][10],N;
 7 int hengxiang(int i){
 8     int yanzheng[11]={0};
 9     for(int k=1;k<=9;k++)
10         if(yanzheng[a[i][k]]==0) yanzheng[a[i][k]]=1;
11         else {/*cout<<"hengxiang"<<i<<" "<<k<<endl;*/return -1;}
12     return 0;
13 }
14
15 int shuxiang(int i){
16     int yanzheng[11]={0};
17     for(int k=1;k<=9;k++)
18         if(yanzheng[a[k][i]]==0) yanzheng[a[k][i]]=1;
19         else {/*cout<<"shuxiang"<<i<<" "<<k<<endl;*/return -1;}
20     return 0;
21 }
22
23 int jiugong(int i,int j){
24     int yanzheng[11]={0};
25     for(int k1=3*i+1;k1<=3*i+3;k1++){
26         for(int k2=3*j+1;k2<=3*j+3;k2++){
27 //            cout<<a[k1][k2]<<" ";
28             if(yanzheng[a[k1][k2]]==0) yanzheng[a[k1][k2]]=1;
29             else {/*cout<<"jiugong i="<<i<<" j="<<j<<" "<<k1<<" "<<k2<<endl;*/return -1;}
30         }
31 //        cout<<endl;
32     }
33 //    cout<<endl;
34     return 0;
35 }
36
37 int main(){
38 //    freopen("01.txt","r",stdin);
39     scanf("%d",&N);
40     for(int s=1;s<=N;s++){
41         memset(a,0,sizeof(a));
42         for(int i=1;i<=9;i++){
43             for(int j=1;j<=9;j++){
44                 scanf("%d",&a[i][j]);
45             }
46         }
47
48         int flag=1;
49
50         if(flag==1) for(int i=1;i<=9;i++) if(hengxiang(i)==-1) {flag=-1;break;}
51         if(flag==1) for(int i=1;i<=9;i++) if(shuxiang(i)==-1) {flag=-1;break;}
52         if(flag==1) for(int i=0;i<3;i++) {
53                         if(flag==1)
54                             for(int j=0;j<3;j++){
55                                 if(jiugong(i,j)==-1) {flag=-1;break;}
56                             }
57                     }
58         if(flag==1) cout<<"Right"<<endl;
59         else cout<<"Wrong"<<endl;
60     }
61     return 0;
62 }

开数组标记1~9
若当前块被标记过了
则接下来所有横向扫描 竖向扫描 九宫格扫描都break
总共调用竖向扫描9次
横向9次
九宫格扫描9次

时间: 2024-11-09 16:04:32

TYVJ P1093 验证数独 Label:none的相关文章

【LeetCode-面试算法经典-Java实现】【036-Valid Sudoku(验证数独棋盘)】

[036-Valid Sudoku(验证数独棋盘)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be partially filled, where empty cells are filled with the character '.'. A partially fi

[LeetCode] Valid Sudoku 验证数独

Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be partially filled, where empty cells are filled with the character '.'. A partially filled sudoku which is valid. Note:A valid Sudoku board (partially

TYVJ P1080 N皇后 Label:dfs PS:以前做的一道题,贴出来防忘

描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 列号  1  2  3  4  5  6 ------------------------- 1 |  | O |  |  |  |  | ------------------------- 2 |  |  |  | O |  |  | ------------------------- 3 |  |  |  |  |  | O | -----

TYVJ P1029 牛棚回声 Label:坑

背景 USACO OCT09 3RD 描述 奶牛们灰常享受在牛栏中牟叫,因為她们可以听到她们牟声的回音.虽然有时候并不能完全听到完整的回音.Bessie曾经是一个出色的秘书,所以她精确地纪录了所有的牟叫声及其回声.她很好奇到底两个声音的重复部份有多长. 输入两个字符串(长度為1到80个字母),表示两个牟叫声.你要确定最长的重复部份的长度.两个字符串的重复部份指的是同时是一个字符串的前缀和另一个字符串的后缀的字符串. 我们通过一个例子来理解题目.考虑下面的两个牟声: moyooyoxyzooo  

TYVJ P1036 统计数字 Label:坑!!!(用queue+map做出来的水)

背景 NOIP2007年提高组第一题 描述 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果. 输入格式 输入包含n+1行:    第1行是整数n,表示自然数的个数.    第2~n+1行每行一个自然数. 输出格式 输出包含m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输出.每行输出两个整数,分别是自然数和该数出现的次数,其间用一个

TYVJ 矩阵取数 Label:高精度+dp

题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2.每次取走的各个元素只能是该元素所在行的行首或行尾: 3.每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分 = 被取走的元素值*2^i,其中i表示第i次取数(从1开始编号): 4.游戏结束总得分为m次取数得分之和. 帅帅想请你帮忙写一个程序,对于任意矩阵,可以求出取数后的最大得分. 输入输

TYVJ P1103 多项式输出 Label:模拟 有点儿坑

描述 一元 n 次多项式可用如下的表达式表示:  f(x)=an*x^n+an-1*x^n-1+...+a1*x+a0,an<>0其中,ai*a^x 称为i次项,ai称为i次项的系数.给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式:1. 多项式中自变量为x,从左到右按照次数递减顺序给出多项式.2. 多项式中只包含系数不为0 的项.3. 如果多项式n 次项系数为正,则多项式开头不出现“+”号,如果多项式n 次项系数为负,则多项式以“-”号开头.4. 对于不是最高次的项,

TYVJ P1067 合唱队形 Label:上升子序列?

背景 NOIP2004 提高组 第三道 描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK,  则他们的身高满足T1<...<Ti>Ti+1>…>TK(1<=i<=K). 你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形. 输入格式 输入文件chorus.in的第一行是

TYVJ P1081 最近距离 Label:这不是分治!!!

描述 在一块地上,有着n(1<=n<=2000) 头牛,输入n,再分别输入这n头牛的坐标(x,y) (1<=x<=100000,1<=y<=100000),如果第i头牛与第j头牛间的距离最近,那么输出i和j 10 | . . . . . . . 3 . . . . .                     9 | . 1 . . 2 . . . . . . . .                     8 | . . . . . . . . . . . . .