26Sudoku Killer
2016-04-19 12:27
309 查看
简单题意
数独游戏,给出个数独,填充完整数独
解题思路形成过程
和老师上课讲的例题差不多,不过这个题使用?来代替未填数的位置,只要改一下就好了。记录所有?位置,判断当前空位置是否可以填某个数,然后直接DFS。
感想
做了好几遍才输出正确结果。。累。
AC代码
#include<iostream>
#include<fstream>
using namespace std;
struct point{
int x,y;
}pur[100];
int map[10][10],flag,num;
int check(int k,int cur){
int i,j,x,y;
for(i=0;i<9;i++)
if(map[pur[cur].x][i]==k||map[i][pur[cur].y]==k)return 0;
x=(pur[cur].x/3)*3;
y=(pur[cur].y/3)*3;
for(i=x;i<x+3;i++)
for(j=y;j<y+3;j++)
if(map[i][j]==k)return 0;
return 1;
}
void DFS(int step){
int i,j;
if(step==num){
for(i=0;i<9;i++){
for(j=0;j<8;j++)
printf("%d ",map[i][j]);
printf("%d\n",map[i][8]);
}
flag=1;
return;
}else{
for(i=1;i<=9;i++){
if(check(i,step)&&!flag){
map[pur[step].x][pur[step].y]=i;
DFS(step+1);
map[pur[step].x][pur[step].y]=0;
}
}
}
return;
}
int main(){
ifstream cin("in.txt");
freopen("in.txt","r",stdin);
int i,j,cas=0;
char s[3];
while(scanf("%s",s)!=EOF){
num=0;
if(s[0]=='?'){pur[num].x=0;pur[num].y=0;num++;map[0][0]=0;}
else map[0][0]=s[0]-'0';
for(i=0;i<9;i++)
for(j=0;j<9;j++){
if(i==0&&j==0)continue;
scanf("%s",s);
if(s[0]=='?'){pur[num].x=i;pur[num].y=j;num++;map[i][j]=0;}
else map[i][j]=s[0]-'0';
}
flag=0;
if(c
a1bf
as++)printf("\n");
DFS(0);
}
return 0;
}
数独游戏,给出个数独,填充完整数独
解题思路形成过程
和老师上课讲的例题差不多,不过这个题使用?来代替未填数的位置,只要改一下就好了。记录所有?位置,判断当前空位置是否可以填某个数,然后直接DFS。
感想
做了好几遍才输出正确结果。。累。
AC代码
#include<iostream>
#include<fstream>
using namespace std;
struct point{
int x,y;
}pur[100];
int map[10][10],flag,num;
int check(int k,int cur){
int i,j,x,y;
for(i=0;i<9;i++)
if(map[pur[cur].x][i]==k||map[i][pur[cur].y]==k)return 0;
x=(pur[cur].x/3)*3;
y=(pur[cur].y/3)*3;
for(i=x;i<x+3;i++)
for(j=y;j<y+3;j++)
if(map[i][j]==k)return 0;
return 1;
}
void DFS(int step){
int i,j;
if(step==num){
for(i=0;i<9;i++){
for(j=0;j<8;j++)
printf("%d ",map[i][j]);
printf("%d\n",map[i][8]);
}
flag=1;
return;
}else{
for(i=1;i<=9;i++){
if(check(i,step)&&!flag){
map[pur[step].x][pur[step].y]=i;
DFS(step+1);
map[pur[step].x][pur[step].y]=0;
}
}
}
return;
}
int main(){
ifstream cin("in.txt");
freopen("in.txt","r",stdin);
int i,j,cas=0;
char s[3];
while(scanf("%s",s)!=EOF){
num=0;
if(s[0]=='?'){pur[num].x=0;pur[num].y=0;num++;map[0][0]=0;}
else map[0][0]=s[0]-'0';
for(i=0;i<9;i++)
for(j=0;j<9;j++){
if(i==0&&j==0)continue;
scanf("%s",s);
if(s[0]=='?'){pur[num].x=i;pur[num].y=j;num++;map[i][j]=0;}
else map[i][j]=s[0]-'0';
}
flag=0;
if(c
a1bf
as++)printf("\n");
DFS(0);
}
return 0;
}
相关文章推荐
- C 语言实现迷宫 DFS算法
- 图的基本算法
- 程序设计实习MOOC/第十五周编程作业/A:棋盘问题
- LeetCode#337. House Robber III
- 深度优先搜索(POJ1164 城堡问题)
- 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
- hdu 2614 Beat
- hdu 1501 Zipper 拉链
- hdu 1175 连连看 经典dfs
- Oil Deposits(深度或广度搜索)
- 19N皇后问题
- 9连连看
- 16Red and Black
- 11Oil Deposits
- HDU 4536 XCOM Enemy Unknown
- HDU 1241 Oil Deposits
- HDU 1518 Square
- HDU 1016 Prime Ring Problem
- HDU 1312 Red and Black
- 旅行商问题(深度优先搜索 回溯法 排列树)