POJ 2918 Tudoku解题报告(复杂模拟)
题目来源:POJ 2918 Tudoku
http://acm.pku.edu.cn/JudgeOnline/problem?id=2918
TOJ 2340 Tudoku
http://acm.tju.edu.cn/toj/showp.php?pid=2340
解法类型:复杂模拟
作者:刘亚宁
题目大意:
将一个空缺的9*9的方格填满,要求每行每列都有1—9的9 个数,而且分成9个3*3的分块后,每块都有1—9 的9个数字。填的过程中,一次只可填一个数字时,便将这个数字填入,必能填满。
解题思路:
模拟人填入的过程,进行填格,用到一些小技巧,详见代码。
提交情况:
无错误提交记录。
注意:
在输入图的时候,不能用int型,因为输入的时候数之间没有空格。
源程序:
#include <iostream>
using namespace std;
int map[10][10],mark[10][10],nine[10],caseNum,i,countNum,j,k,passI,passJ,num=0;
char cMap[10][10];
void block(int rowDn, int rowUp, int colDn, int colUp )
{
k=0;
memset(nine,0,sizeof(nine));
for(i=rowDn;i<=rowUp;i++)
{
for(j=colDn;j<=colUp;j++)
{
nine[map[i][j]]=1;
if(mark[i][j])
{
passI=i;
passJ=j;
k++;
}
}
}
if(k==1)
{
for(j=1;j<=9;j++) if(nine[j]==0) break;
map[passI][passJ]=j;
mark[passI][passJ]=0;
}
if(k==0) num++;
}
int main()
{
cin>>caseNum;
for(countNum=1;countNum<=caseNum;countNum++)
{
memset(mark,0,sizeof(mark));
for(j=1;j<=9;j++)
{
for(k=1;k<=9;k++)
{
cin>>cMap[j][k];
map[j][k]=cMap[j][k]-'0';
if(map[j][k]==0) mark[j][k]=1;
}
}
while(1)
{
num=0;
for(i=1;i<=9;i++)
{
k=0;
memset(nine,0,sizeof(nine));
for(j=1;j<=9;j++)
{
nine[map[i][j]]=1;
if(mark[i][j])
{
passI=i;
passJ=j;
k++;
}
}
if(k==0) num++;
if(k==1)
{
for(j=1;j<=9;j++) if(nine[j]==0) break;
map[passI][passJ]=j;
mark[passI][passJ]=0;
}
}
if(num==9) break;
num=0;
for(i=1;i<=9;i++)
{
k=0;
memset(nine,0,sizeof(nine));
for(j=1;j<=9;j++)
{
nine[map[j][i]]=1;
if(mark[j][i])
{
passI=i;
passJ=j;
k++;
}
}
if(k==0) num++;
if(k==1)
{
for(j=1;j<=9;j++) if(nine[j]==0) break;
map[passJ][passI]=j;
mark[passJ][passI]=0;
}
}
if(num==9) break;
num=0;
block(1,3,1,3);
block(1,3,4,6);
block(1,3,7,9);
block(4,6,1,3);
block(4,6,4,6);
block(4,6,7,9);
block(7,9,1,3);
block(7,9,4,6);
block(7,9,7,9);
if(num==9) break;
}
cout<<"Scenario #"<<countNum<<":"<<endl;
for(j=1;j<=9;j++)
{
for(k=1;k<=9;k++) cout<<map[j][k];
cout<<endl;
}
cout<<endl;
}
return 0;
}
posted on 2010-03-05 10:15 liugoodness 阅读(406) 评论(0) 编辑 收藏 举报