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) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述