博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 2676 Suduku (dfs)
阅读量:5788 次
发布时间:2019-06-18

本文共 1591 字,大约阅读时间需要 5 分钟。

单纯的dfs,用三个数组记录行、列以及3×3方格的情况。 

只是一开始不知道为什么没办法结束程序的运行,提交两次TLE,感觉应该是getchar()的问题。

code:

#include<cstdio>
#include<iostream>
#include<cstring>
using 
namespace std ;
bool c[
10][
10] ;
bool r[
10][
10] ;
bool s[
4][
4][
10] ;
bool vis[
10][
10] ;
char str[
10] ;
int data[
10][
10] ;
bool flag ;
int cur(
int x){
    
if(x<
3
return 
1 ;
    
else 
if(x<
6
return 
2 ;
    
else    
return 
3 ;
}
void dfs(
int row, 
int col){
    
if(row==
9){
        flag = 
true ;
        
return ;
    }
    
if(vis[row][col]){
        
if(col==
8)    dfs(row+
1
0) ;
        
else        dfs(row, col+
1) ;
    }
    
else{
        vis[row][col] = 
true ;
        
for(
int i=
1; i<=
9; i++){
            
if(flag)    
break ;
            
if(!r[row][i]&&!c[col][i]&&!s[cur(row)][cur(col)][i]){
                data[row][col] = i ;
                r[row][i] = 
true ;
                c[col][i] = 
true ;
                s[cur(row)][cur(col)][i] = 
true ;
                
if(col==
8)
                    dfs(row+
1
0) ;
                
else
                    dfs(row, col+
1) ;
                r[row][i] = 
false ;
                c[col][i] = 
false ;
                s[cur(row)][cur(col)][i] = 
false ;
            }
        }
        vis[row][col] = 
false ;
    }
}
int main(){
    
int t, i, j ;
    scanf(
"
%d
", &t) ;
    
while(t--){
        memset(vis, 
false
sizeof(vis)) ;
        
for(i=
0; i<
9; i++){
            getchar() ;
            scanf(
"
%s
", str) ;
            
for(j=
0; j<
9; j++){
                data[i][j] = str[j] - 
'
0
' ;
                
if(data[i][j]>
0)    vis[i][j] = 
true ;
            }
        }
        memset(c, 
false
sizeof(c)) ;
        memset(r, 
false
sizeof(r)) ;
        memset(s, 
false
sizeof(s)) ;
        
for(i=
0; i<
9; i++)
            
for(j=
0; j<
9; j++){
                
if(data[i][j]>
0){
                    r[i][data[i][j]] = 
true ;
                    c[j][data[i][j]] = 
true ;
                    s[cur(i)][cur(j)][data[i][j]] = 
true ;
                }
            }
        flag = 
false ;
        dfs(
0
0) ;
        
for(i=
0; i<
9; i++){
            
for(j=
0; j<
9; j++)
                printf(
"
%d
", data[i][j]) ;
            printf(
"
\n
") ;
        }
    }
    
return 
0 ;

转载于:https://www.cnblogs.com/xiaolongchase/archive/2012/02/16/2353465.html

你可能感兴趣的文章
python 常见内置函数setattr、getattr、delattr、setitem、getitem、delitem
查看>>
使用bat脚本添加JAVA_HOME和修改PATH
查看>>
全自动备份vss和sql数据库(含源码下载)
查看>>
[转] boost undefined reference to 'pthread_create 问题
查看>>
如何不显示地图就获取位置数据?
查看>>
读取指定文件夹限定文件
查看>>
EF 更新条目时出错。有关详细信息,请参见内部异常。
查看>>
TIDB介绍 新数据库趋势
查看>>
ArcGIS For Flex学习之Mapping---Map Extent and Mouse Coordinates
查看>>
libgdx的菜单配置,以及json文件的结构
查看>>
Git基础知识与常用命令
查看>>
Set和Map数据
查看>>
关于Patter类和Match类
查看>>
[改善Java代码]生成子列表后不要再操作原列表
查看>>
9套Android实战经典项目资料分享给大家
查看>>
第2个程序:用C语言实现点亮一盏led
查看>>
.net消息队列
查看>>
sys.stdout.write与sys.sterr.write(一)
查看>>
向Maven的本地库中添加jar文件
查看>>
centos7.0上安装五笔输入法
查看>>