C++枚举 数独验证

题目描述

给你一个数独,并需要你验证是否符合规则。具体规则如下:

每一行都用到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” 输出一个换一行
 

样例输入 Copy

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

样例输出 Copy

Right
Wrong

解决方法:分块判断;

#include <iostream>
#include <algorithm>
using namespace std;
struct jiugongge
{
	int shuru[9][9];
	string shuchu;
};
int main()
{
	int y;//循环次数;
	cin>>y;//输入循环次数;
	jiugongge x[y+1]; 
	int hangtiaojian;//行条件应该为9;
	int lietiaojian;//列条件应该为9; 
	int xiaojiugong;//小九宫格条件应该为9; 
	int biaozhun[9]={1,2,3,4,5,6,7,8,9};
	//标准值,用于行、列、小九宫格的对比 ; 
	for(int v=1;v<=y;v++)
	{
		//初始化数据;
		hangtiaojian=0;
		lietiaojian=0; 
		xiaojiugong=0;
		//输入数组; 
		for(int i=0;i<9;i++)
			for(int j=0;j<9;j++)
				cin>>x[v].shuru[i][j];
		//检查每行是否满足; 
		for(int i=0;i<9;i++)
		{
			int b[9]={0};//第i行初始化;
			//第i行赋值存储; 
			for(int j=0;j<9;j++)
				b[j]=x[v].shuru[i][j];
			sort(b,b+9);
			int weishu1=0;
			for(int j=0;j<9;j++)
				 if(biaozhun[j]==b[j])
				 	weishu1++;
	 		if(weishu1==9)
	 			hangtiaojian++;
		}
		//cout<<hangtiaojian<<endl;
		//检查每列是否满足;
		for(int j=0;j<9;j++)
		{
			int c[9]={0};//第j列初始化;
			//第j列赋值存储; 
			for(int i=0;i<9;i++)
				c[i]=x[v].shuru[i][j];
			sort(c,c+9);
			int weishu2=0;
			for(int i=0;i<9;i++)
				if(biaozhun[i]==c[i])
					weishu2++;
			if(weishu2==9)
				lietiaojian++;
		}
		//cout<<lietiaojian<<endl;
		//检查每个小九宫格是否满足:
		for(int i=0;i<9;i+=3)//0第一个 3第四个 6第七个 
			for(int j=0;j<9;j+=3)
			//把每个小九宫格的左上角元素确定了;
			//下面都以x[v].shuru[0][0]所对应的小九宫格为例;
			{
				int d[9]={0}; //小九宫格初始化;
				int t=-1; 
				//在每个小九宫格里,将每一个元素放入数组中存储;
				for(int m=i;m<i+3;m++)
				{
					t++;
					d[t]=x[v].shuru[m][j];
				}
				for(int m=i;m<i+3;m++)
				{
					t++;
					d[t]=x[v].shuru[m][j+1];
				}
				for(int m=i;m<i+3;m++)
				{
					t++;
					d[t]=x[v].shuru[m][j+2];
				}	
				sort(d,d+9);
				//cout<<"t="<<t<<endl;//检测; 
				for(int p=0;p<3;p++)//检测; 
					cout<<d[p]<<" ";//检测; 
				int weishu3=0;
				for(int m=0;m<9;m++)
					if(biaozhun[m]==d[m])
						weishu3++;
				if(weishu3==9)
					xiaojiugong++;
			} 
		x[v].shuru = hangtiaojian == 9 && lietiaojian == 9 
			&& xiaojiugong == 9 ? "Right" : "Wrong";					 
	}
	for(int i=1;i<=y;i++)
		cout<<x[i].shuchu<<endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青山入墨雨如画

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值