小米OJ 54(数独游戏)

                                                  数独游戏
                              序号:#54  难度:一般  时间限制:1000ms  内存限制:10M

描述
数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称"九宫格"。 一个合法的数独棋盘满足上面的条件,即1-9每个数字在每一行、每一列和每一宫中都只出现一次,而并不要求一定有解。 请判断给出的数独棋盘是否合法。
举例: 有一个数独棋盘如下:
5 3 - - 7 - - - -
6 - - 1 9 5 - - -
- 9 8 - - - - 6 -
8 - - - 6 - - - 3
4 - - 8 - 3 - - 1
7 - - - 2 - - - 6
- 6 - - - - 2 8 -
- - - 4 1 9 - - 5
- - - - 8 - - 7 9
它是一个合法棋盘,输出true。

输入
从左到右从上到下,使用空格分隔每一宫,使用逗号分隔每一格,没有数字则代表该格为空。

输出
true或false表示该数独棋盘是否合法。

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

输出样例
true
false

#include<iostream>
using namespace std;
int main()
{
	char a[9][9];
	int b[9][9],d[9][9],c[10]={0},i=0,m=0,s[10]={0},j,z,k;
	char t;
	while(cin>>a[i][0]>>t>>a[i][1]>>t>>a[i][2]>>t>>a[i][3]>>t>>a[i][4]>>t>>a[i][5]>>t>>a[i][6]>>t>>a[i][7]>>t>>a[i][8])
	{
		for(j=0;j<9;j++)
		{
			if(a[i][j]>='1'&&a[i][j]<='9')
			{
				b[i][j]=a[i][j]-'0';
			}
			else
			{
				b[i][j]=0;
			}
		}
		i++;
	}
	for(i=0;i<9;i++)
	{
		for(j=0;j<9;j++)
		{
			d[j/3+3*(i/3)][j%3+(i%3)*3]=b[i][j];
		}
	}
	for(i=0;i<9;i++)
	{
		for(j=0;j<9;j++)
		{
			c[d[i][j]]++;
		}
		for(j=1;j<=9;j++)
		{
			if(c[j]>=2)
			{
				m=1;
				break;
			}
		}
		if(m==1)
			break;
		for(j=1;j<=9;j++)
		{
			c[j]=0;
		}
	}
	if(m==0)
	{
		for(i=0;i<9;i++)
		{
			for(j=0;j<=9;j++)
			{
				c[j]=0;
			}
			for(j=0;j<9;j++)
			{
				c[d[j][i]]++;
			}
			for(j=1;j<=9;j++)
			{
				if(c[j]>=2)
				{
					m=1;
					break;
				}
			}
			if(m==1)
				break;
		}
		if(m==0)
		{
			for(i=0;i<7;i+=3)
			{
				for(j=0;j<7;j+=3)
				{
					for(z=0;z<=9;z++)
					{
						s[z]=0;
					}
					for(z=i;z<=i+2;z++)
					{
						for(k=j;k<=j+2;k++)
						{
							s[d[z][k]]++;
						}
					}
					for(z=1;z<=9;z++)
					{
						if(s[z]>=2)
						{
							m=1;
							break;
						}
					}
					if(m==1)
						break; 
				}
				if(m==1)
					break;  
			}
			if(m==0)
			{
				cout<<"true"<<endl;
			}
			else
			{
				cout<<"false"<<endl;
			} 
		}
		else
		{
			cout<<"false"<<endl;
		}
	}
	else
	{
		cout<<"false"<<endl;
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值