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  阅读(403)  评论(0编辑  收藏  举报

导航