小米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;
}
### 关于东华大学OJ平台上棋盘游戏题目的解题思路 对于东华大学在线评测系统(OJ)中的棋盘游戏题目,特别是涉及复杂逻辑推理和算法设计的问题,建议采取逐步深入的方法来理解和解决问题。 #### 对于遇到难题时的态度 面对完全无从下手的情况,保持耐心非常重要。不应立即寻求他人帮助或查看解答,而是尝试转换思维角度,通过解决其他类型的题目积累经验后再回头审视原问题[^1]。这种策略有助于培养独立思考能力和提高编程技巧。 #### 以2n皇后问题为例的具体分析 具体到像“2n皇后问题”这样的经典棋盘布局挑战,在实现过程中需要注意几个方面: - **初始化阶段**:仔细解析给定的输入数据——即棋盘状态矩阵,其中`0`表示该位置不可放置皇后。 - **核心算法设计**:采用深度优先搜索(DFS)作为主要手段来进行穷举可能的状态空间树。每次递归调用都需要确保新加入的一对黑白皇后满足以下条件: - 不在同一行; - 不在同一列; - 斜向也不冲突; - 黑白两个皇后不在同一个单元格内。 这里给出一段简化版Python代码框架用于演示如何构建上述过程: ```python def dfs(board, row): global count if row >= n: count += 1 return for col_black in range(n): if not is_safe(board, row, col_black,'black'): continue board[row][col_black]='B' for col_white in range(n): if (not is_safe(board, row, col_white,'white') or col_white==col_black):continue board[row][col_white]='W' dfs(board,row+1) board[row][col_white]=0 board[row][col_black]=0 def is_safe(board,x,y,color): # Check this row on left side and diagonal positions... pass count=0 board=[[0]*8 for _ in range(8)] dfs(board,0) print(count) ``` 此段伪代码展示了基本框架,实际应用中还需要完善`is_safe()`函数以及其他边界情况处理机制。 #### 总结 综上所述,针对此类棋盘类竞赛题目,除了掌握必要的回溯法等基础知识外,更重要的是锻炼自己的抽象建模能力以及灵活运用已有知识的能力。同时也要注意避免常见的错误陷阱,比如忽视某些特殊情况下的约束条件验证等问题[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值