HDU杭电1426-Realtime Status 数独问题

来源:互联网 发布:java中工厂模式是什么 编辑:程序博客网 时间:2024/06/05 18:25

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1426

/****************************

第一次做数独问题,没做之前觉得就是一个搜索题,然而写起代码来就错误重重了!

问号的输入我用了字符串接收(%s),详见代码。

dfs。深搜即可

在提交题目时注意,不同的示例之间空一行。最后结束前的一组后面没有空行。


我的代码提交时间是889MS,效率欠佳。

/******************************************

代码如下:

/*****************

#include<stdio.h>int map[10][10];int w[88];//记录问号位置int e; //记录问号个数 int myscanf()//矩阵的输入{e=0;char x[3];for(int i=1;i<=9;i++)for(int j=1;j<=9;j++){if(scanf("%s",x)==EOF)return 0;if(x[0]!='?'){map[i][j]=x[0]-'0';}else{map[i][j]=0;//代表问号w[e++]=i*10+j;}}return 1; } void output(){for(int i=1;i<=9;i++){for(int j=1;j<=8;j++){printf("%d ",map[i][j]);}printf("%d\n",map[i][9]);}}int ok(int a,int b,int k)//检查k能否填在位置ab {for(int i=1;i<=9;i++)//检查行{if(k==map[a][i])return 0;}for(int i=1;i<=9;i++)//检查列{if(k==map[i][b])return 0;}a=(a-1)/3*3+1;b=(b-1)/3*3+1;for(int i=a;i<=a+2;i++)//检查小九宫格{for(int j=b;j<=b+2;j++){if(k==map[i][j])return 0;}}return 1;}void dfs(int a)//w[a]的十位数和个位数代表位置{int k=w[a]/10,l=w[a]%10;if(a==e)//全填完了{output();return;}//填数for(int i=1;i<=9;i++)//把i填进去 {if(ok(k,l,i))//i可以填在此处 {map[k][l]=i;dfs(a+1);map[k][l]=0;}}}int main(){int flag=0;while(myscanf())//矩阵输入 {if(flag++)puts("");//空行的输出dfs(0);}return 0;}



0 0