Problem Description
自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视。 据说,在2008北京奥运会上,会将数独列为一个单独的项目进行比赛,冠军将有可能获得的一份巨大的奖品———HDU免费七日游外加lcy亲笔签名以及同hdu acm team合影留念的机会。 所以全球人民前仆后继,为了奖品日夜训练茶饭不思。当然也包括初学者linle,不过他太笨了又没有多少耐性,只能做做最最基本的数独题,不过他还是想得到那些奖品,你能帮帮他吗?你只要把答案告诉他就可以,不用教他是怎么做的。
数独游戏的规则是这样的:在一个9x9的方格中,你需要把数字1-9填写到空格当中,并且使方格的每一行和每一列中都包含1-9这九个数字。同时还要保证,空格中用粗线划分成9个3x3的方格也同时包含1-9这九个数字。比如有这样一个题,大家可以仔细观察一下,在这里面每行、每列,以及每个3x3的方格都包含1-9这九个数字。
例题:
答案:
 
Input
本题包含多组测试,每组之间由一个空行隔开。每组测试会给你一个 9*9 的矩阵,同一行相邻的两个元素用一个空格分开。其中1-9代表该位置的已经填好的数,问号(?)表示需要你填的数。
 
Output
对于每组测试,请输出它的解,同一行相邻的两个数用一个空格分开。两组解之间要一个空行。 对于每组测试数据保证它有且只有一个解。
 
Sample Input
7 1 2 ? 6 ? 3 5 8
? 6 5 2 ? 7 1 ? 4
? ? 8 5 1 3 6 7 2
9 2 4 ? 5 6 ? 3 7
5 ? 6 ? ? ? 2 4 1
1 ? 3 7 2 ? 9 ? 5
? ? 1 9 7 5 4 8 6
6 ? 7 8 3 ? 5 1 9
8 5 9 ? 4 ? ? 2 3
 
Sample Output
7 1 2 4 6 9 3 5 8
3 6 5 2 8 7 1 9 4
4 9 8 5 1 3 6 7 2
9 2 4 1 5 6 8 3 7
5 7 6 3 9 8 2 4 1
1 8 3 7 2 4 9 6 5
2 3 1 9 7 5 4 8 6
6 4 7 8 3 2 5 1 9
8 5 9 6 4 1 7 2 3
 #include<iostream>
using namespace std;
char fch[][];
int r[][],c[][],d[][],co;
struct
{
int i,j;
int w;
}que[];
int f(int i,int j)//计算位于第几个小方格
{
int r=i%==?i/:i/+;
int c=j%==?j/:j/+;
return (r-)*+c;
}
int dfs(int i)
{
if(i>=co) return ;
else
{
for(int j=;j<=;j++)
{
if(r[que[i].i][j]==&&c[que[i].j][j]==&&d[f(que[i].i,que[i].j)][j]==)
{
r[que[i].i][j]=;
c[que[i].j][j]=;
d[f(que[i].i,que[i].j)][j]=;
que[i].w=j;
if(dfs(i+)) return ;
r[que[i].i][j]=;
c[que[i].j][j]=;
d[f(que[i].i,que[i].j)][j]=;
}
}
return ;
}
}
int main()
{
int i,j,temp,mark=;
while(cin>>fch[][])
{
co=;
memset(r,,sizeof(r));
memset(c,,sizeof(r));
memset(d,,sizeof(r));
if(fch[][]!='?')
{
temp=fch[][]-'';
r[][temp]=;
c[][temp]=;
d[f(,)][temp]=;
}
else
{
que[co].i=;
que[co].j=;
co++;
}
for(i=;i<=;i++)
for(j=;j<=;j++)
{
if(i==&&j==) continue;
cin>>fch[i][j];
if(fch[i][j]!='?')
{
temp=fch[i][j]-'';
r[i][temp]=;
c[j][temp]=;
d[f(i,j)][temp]=;
}
else
{
que[co].i=i;
que[co].j=j;
co++;
}
}
if(mark==)
cout<<endl;
mark=;
int k;
if(dfs())
for(i=,k=;i<=;i++)
{
if(fch[i][]!='?')
cout<<fch[i][];
else cout<<que[k++].w;
for(j=;j<=;j++)
{
if(fch[i][j]!='?')
cout<<' '<<fch[i][j];
else cout<<' '<<que[k++].w;
}
cout<<endl;
} }
return ; }

最新文章

  1. Spring注解
  2. linux编程问题记录
  3. 让dwz 在td里显示图片
  4. POJ2288 Islands and Bridges
  5. JNI 学习笔记
  6. ISO-9126 软件质量模型
  7. Java基础知识强化之集合框架笔记61:Map集合之统计字符串中每个字符出现的次数的案例
  8. [RxJS] Reactive Programming - Clear data while loading with RxJS startWith()
  9. nginx的五种负载算法模式
  10. javascript代码实现简单的五星评价功能!
  11. 刷新UITableView
  12. js 中 new fn与new fn()的区别
  13. VisualStudio移动开发(C#、VB.NET)Smobiler开发平台——BarcodeView控件的使用方式,.Net移动开发
  14. 查找已连接过的wifi密码
  15. Word frequency program ver.1
  16. POJ 2501
  17. allegro 封装 (引脚编号修改)
  18. Spring事务处理探究
  19. Linux 150命令之查看文件及内容处理命令 cat tac less head tail cut
  20. PHPCMS新闻内容调用方法介绍

热门文章

  1. 【移动开发】WIFI热点通信(一)
  2. 话付通SDK 聚合支付
  3. SpringMVC09异常处理和类型转化器
  4. await, anync
  5. MyEclipse Web Project导入Eclipse Dynamic Web Project,无法部署到tomcat问 题
  6. MySQL TEXT数据类型的最大长度
  7. 有关phpmailer的详细介绍及使用方法
  8. Android开发手记(8) ProgressDialog的使用
  9. Css Div半透明
  10. 1.3.1 switch 语句中的 String