数独游戏
数独游戏是由99共81个格子组成,其中整个网格分为33的大格子,大格子又分为3*3的小格子,给定一些格子中的数,往空白格子里面填数。规则是:只能填1-9这9个数字,而且每一行,每一列和每一大格子里一个数字只能出现一次。
输入格式:将81个字符按先下后上先左后右的顺序输为一行(未知的空白格子用‘ . ’表示),end表示结束的标志。
输出格式:每个输入数据输出为一行。
#include <bits/stdc++.h>
using namespace std;
string temp;
char maps[9][9];
bool judge(int count){ //判断这个数字能不能放进去
int row=count/9;
int col=count%9;
//同一行不能有相同的
for(int i=0;i<9;i++){
if(maps[row][i]==maps[row][col] && i!=col){
return false;
}
}
//同一列不能有相同的
for(int i=0;i<9;i++){
if(maps[i][col]==maps[row][col]&& i!=row){
return false;
}
}
//同一个3*3小方块里不能有相同的
int x=row/3*3;
int y=col/3*3; //找到所在小方块左上角的位置
for(int i=x;i<x+3;i++){
for(int j=y;j<y+3;j++){
if(maps[i][j]==maps[row][col]&&i!=row&&j!=col){
return false;
}
}
}
}
void retrace(int count){
if(count==81){
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
cout<<maps[i][j];
}
}
cout<<endl;
return;
}
int row=count/9;
int col=count%9;
if(maps[row][col]=='.'){
for(int i=0;i<9;i++){
maps[row][col]=(char)('1'+i);
if(judge(count)){
retrace(count+1); //扫描下一个小方格
}
}
maps[row][col]='.'; //回溯
}
else
{
retrace(count+1);
}
}
int main()
{
while(cin>>temp,temp!="end"){
int q=0;
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
maps[i][j]=temp[q++];
}
}
retrace(0);
}
system("pause");
return 0;
}
感觉这种方法太过暴力,递归层数太多,而且无优化,遇到特殊的数据可能回超时,如果读者有好的算法或者优化方法,希望在评论区指出,互相学习,共同进步!