首页 > 编程知识 正文

数独六宫格题目,数独简单题目入门

时间:2023-05-04 14:27:35 阅读:211354 作者:3729

http://acm.sjtu.edu.cn/OnlineJudge/problem/1005


题目描述

数独游戏,具体规则如下:

每一行都用到1,2,3,4,5,6,7,8,9, 位置不限,

每一列都用到1,2,3,4,5,6,7,8,9, 位置不限,

每3*3的格子(共9个这样的格子)都用到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,

如下是个正确的sudoku:

输入格式

输入n个数独,你来验证它是否违反规则。

第一行为数独个数,第二行开始为第一个数独,之后第二个,至第n个。

注意:每个数独间有个回车隔开。

输出格式

若正确则输出"Right",否则输出"Wrong", 输出一个换一行。

说明

1<=n<=20(输入的数独个数)

不论输入的数独是否正确,数据保证每个数都在1-9间。

Sample Input 25 8 1 4 9 3 7 6 29 6 3 7 1 2 5 8 42 7 4 8 6 5 9 3 11 2 9 5 4 6 3 7 84 3 6 1 8 7 2 9 57 5 8 3 2 9 1 4 68 9 2 6 7 1 4 5 36 1 5 9 3 4 8 2 73 4 7 2 5 8 6 1 91 2 3 4 5 6 7 8 92 3 4 5 6 7 8 9 13 4 5 6 7 8 9 1 24 5 6 7 8 9 1 2 35 6 7 8 9 1 2 3 46 7 8 9 1 2 3 4 57 8 9 1 2 3 4 5 68 9 1 2 3 4 5 6 79 1 2 3 4 5 6 7 8 Sample Output RightWrong

***********************************************************************************************************************************

这道题比较简单,定义一个动态三维数组,输入数据后,再做行检查、列检查、和块检查,如果都正确刚说明该独是正确的。编程的时候,细心一些,问题应该不大。

代码如下:

#include <iostream>#include <string>using namespace std;int main(){int n;cin>>n;int ***p = new int **[n]; //三维数组int b[10] = {0}; //用10是为了方面后面的用b的下标来计数string *decision = new string[n];for(int i = 0; i < n; i++) //初始化,在后面的操作中有错误的会被置为“Wrong” decision[i] = "Right";for(int i = 0; i < n ; i ++) //申请内存空间{p[i] = new int *[9]; for(int j = 0; j < 9; j++){p[i][j] = new int[9];}}for(int i = 0; i < n ; i++) //输入兼行检查{for(int j = 0 ; j < 9 ; j++){for(int l = 0; l < 10; l++)b[l] = 0;for(int k = 0; k < 9; k++) //行检查{cin>>p[i][j][k]; //输入b[p[i][j][k]]++; // p[i][j][k]元素值对应b[]的下标。 if(b[p[i][j][k]] > 1) //说明值 p[i][j][k] 出现了两次以上。 {decision[i] = "Wrong";}}}}for(int i = 0; i < n ; i++) //列检查{if("Wrong" == decision[i]) continue;for(int j = 0 ; j < 9 ; j++){//******节省一点时间if("Wrong" == decision[i]) break;;//*********************for(int l = 0; l < 10; l++)b[l] = 0; for(int k = 0; k < 9; k++){b[p[i][k][j]]++;if(b[p[i][k][j]]>1){decision[i] = "Wrong";break;}}}}for(int i = 0; i < n ; i++) //分块检查每块大小为3*3{if("Wrong" == decision[i]) continue;for(int j = 0 ; j < 3 ; j++){for(int k = 0; k < 3; k++){//******节省一点时间if("Wrong" == decision[i]) break;//*********************for(int l = 0; l < 10; l++)b[l] = 0;for(int x = 0; x < 3; x++)for(int y = 0; y < 3; y++){b[p[i][3*j+x][3*k+y]]++;if(b[p[i][3*j+x][3*k+y]]>1){decision[i] = "Wrong";break;}}}}}for(int i = 0; i < n ; i++) //输出结果{cout<<decision[i]<<endl;}return 0;}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。