dfs + 回溯


hdoj 1426 Sudoku Killer

数独

#include <iostream>
using namespace std;
 
struct Node {
    int x, y;
}ns[85];
 
int cntSum, ca=1;
int mp[10][10];
 
bool init() {
    int i, j;
    char ch[5];
    cntSum = 0;
    for( i=0; i<9; ++i ) {
        for( j=0; j<9; ++j ) {
            if( scanf( "%s", ch ) == EOF ) return 0;
            if( ch[0] == '?' ) {
                ns[cntSum].x = i;
                ns[cntSum++].y = j;
                mp[i][j] = 0;
            } else {
                mp[i][j] = ch[0] - '0';
            }
        }
    }
}
 
 
bool canPut( int deep, int v ) {
    int x, y, i, j, a, b;
    x = ns[deep].x;
    y = ns[deep].y;
    for( i=0; i<9; ++i ) if( i != y && mp[x][i] == v ) return 0;
    for( i=0; i<9; ++i ) if( i != x && mp[i][y] == v ) return 0;
    a = x / 3;
    b = y / 3;
    for( i=a*3; i<=a*3+2; ++i ) {
        for( j=b*3; j<=b*3+2; ++j ) {
            if( i!=x && j!=y && mp[i][j] == v ) return 0;
        }
    }
    return 1;
}
     
 
bool dfs( int deep) {
    if( deep >= cntSum ) return 1;
    for( int i=1; i<=9; ++i ) {
        if( canPut( deep, i ) ) {
            mp[ns[deep].x][ns[deep].y] = i;
            if( dfs( deep+1) ) return 1;
            mp[ns[deep].x][ns[deep].y] = 0;
        }
    }
    return 0;
}  
 
 
void solve() {
    int i;
    for( i=1; i<=9; ++i ) {
        if( canPut(0, i) ) {
            mp[ns[0].x][ns[0].y] = i;
            if( dfs( 1 ) ) return;
            mp[ns[0].x][ns[0].y] = 0;
        }
    }
}
 
 
void Print() {
    int i, j;
    if( ca != 1 ) printf( "\n" );
    ++ ca;
    for( i=0; i<9; ++i ) {
        for( j=0; j<9; ++j ) {
            if( j!= 0 ) putchar( ' ' );
            printf( "%d", mp[i][j] );
        }
        printf( "\n" );
    }
}
 
 
int main() {
//  freopen( "c:/aaa.txt", "r", stdin );
    int i, j;
    char ch[5];
    while( init() ) {
        solve();
        Print();
    }
    return 0;
}

优质内容筛选与推荐>>
1、看不懂的C++: enum class
2、需求分析是CRM系统实施的关键
3、500G !!史上最全的JAVA全套教学视频网盘分享 (JEECG开源社区)
4、AutoResetEvent使用及线程相关资料收集
5、函数的初始、函数的定义、函数的调用、函数的返回值、函数的参数


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号