永发信息网

用C语言怎么解数独

答案:2  悬赏:60  手机版
解决时间 2021-02-04 22:16
用C语言怎么解数独
最佳答案
#include   
#include   

#define SIZE 9  
#define get_low_bit(x) ((~x&(x-1))+1)  

struct{  
    int left;  
    char num;     
    char try;  
}board[SIZE][SIZE];  

int bit2num(int bit)  
{  
    switch(bit){  
        case 1:case 2:  
            return bit;   
        case 4:  
            return 3;  
        case 8:  
            return 4;  
        case 16:  
            return 5;  
        case 32:  
            return 6;     
        case 64:          
            return 7;     
        case 128:  
            return 8;     
        case 256:  
            return 9;  
    }     
}  

void printf_res()  
{  
    int i, j, k;      

    for(i=0; i     {  
        if(i%3==0)    
        {  
            for(j=0; j                 putchar('-');  
            putchar('\n');  
        }         

        for(j=0; j         {  
            if(j%3==0)  
                putchar('|');  
            if(board[i][j].num > 0)  
                printf("\033[0;31m%2d\033[0m", board[i][j].num);  
            else  
                printf("%2d", board[i][j].try);  
        }     
        printf("|\n");  
    }  
    for(i=0; i         putchar('-');  
    putchar('\n');  
}  

void sub(int i, int j, int bit)  
{  
    int k, m;     

    for(k=0; k     {  
        board[k][j].left &= ~bit;  
        board[i][k].left &= ~bit;  
    }         

    for(k=i/3*3; k<(i/3+1)*3; k++)  
        for(m=j/3*3; m<(j/3+1)*3; m++)  
            board[k][m].left &= ~bit;     
}  

void init()  
{  
    int i, j;     

    for(i=0; i         for(j=0; j             if(board[i][j].num > 0)  
                sub(i, j, 1<<(board[i][j].num-1));  
            else if(board[i][j].try > 0)  
                sub(i, j, 1<<(board[i][j].try-1));  
}  

void add(int i, int j, int bit)  
{  
    int k, m;  

    for(k=0; k     {  
        board[k][j].left |= bit;  
        board[i][k].left |= bit;  
    }  
    for(k=i/3*3; k<(i/3+1)*3; k++)  
        for(m=j/3*3; m<(j/3+1)*3; m++)  
            board[k][m].left |= bit;  
}  

void solve(int pos)  
{  
    int i=pos/SIZE;   
    int j=pos%SIZE;   
    int bit, left;  

    if(pos == SIZE*SIZE)  
    {  
        printf_res();  
        exit(0);          
    }  
    if(board[i][j].num > 0)  
        solve(pos+1);     
    else  
        for(left=board[i][j].left; left; left&=(left-1))  
        {  
            bit = get_low_bit(left);  
            sub(i, j, bit);  
            board[i][j].try = bit2num(bit);  

            solve(pos+1);  

            add(i, j, bit);  
            board[i][j].try=0;  
            init();       
        }         
}  

int main()  
{  
    int i, j, c;  

    for(i=0; i         for(j=0; j         {  
            while((c=getchar())<'0' || c>'9')  
                ;  
            board[i][j].num = c-'0';  
            board[i][j].try = 0;  
            board[i][j].left = 0x0001FF;          
        }                 
    init();  
    solve(0);  

    return 0;  
}
全部回答
#include #include #include char sd[81]; bool isok = false; //显示数独 void show() { if (isok) puts("求解完成"); else puts("初始化完成"); for (int i = 0; i < 81; i++) { putchar(sd[i] + '0'); if ((i + 1) % 9 == 0) putchar('\n'); } putchar('\n'); } //读取数独 bool init() { file *fp = fopen("in.txt", "rb"); if (fp == null) return false; fread(sd, 81, 1, fp); fclose(fp); for (int i = 0; i < 81; i++) { if (sd[i] >= '1' && sd[i] <= '9') sd[i] -= '0'; else sd[i] = 0; } show(); return true; } //递归解决数独 void force(int k) { if (isok) return; if (!sd[k]) { for (int m = 1; m <= 9; m++) { bool mm = true; for (int n = 0; n < 9; n++) { if ((m == sd[k/27*27+(k%9/3)*3+n+n/3*6]) || (m == sd[9*n+k%9]) || (m == sd[k/9*9+n])) { mm = false; break; } } if (mm) { sd[k] = m; if (k == 80) { isok = true; show(); return; } force(k + 1); } } sd[k] = 0; } else { if (k == 80) { isok = true; show(); return; } force(k + 1); } } int main() { system("cls"); if (init()) { double start = clock(); force(0); printf("耗时%.0fms", clock() - start); } else puts("初始化错误"); getchar(); }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
男左女右造型地址在什么地方,我要处理点事
驼房营南里东门(人行门)在什么地方啊,我要过
平板电脑在外面没怎么办买什么才能有网
车子年检需要注意哪些事项?具体检查哪些啊
心愿发艺工作室怎么去啊,我要去那办事
reloaded怎么读
不戴的耳钉怎么保存比较好一点
北京通州梁家务垃圾填埋场什么时候征地
攀想的意思是什么啊?知道的请说下!
诊断为第二度Ⅰ型房室传导阻滞的是A.P-R间期
刚买了一个tq2440开发板,发现自己不会下载程
陕西协力光电仪器有限公司地址在什么地方,想
常平有地铁站吗?
女朋友不听话怎么办
有头有脸怎么去啊,我要去那办事
推荐资讯
中国铁路是国有还是私有制
我是做包子馒头的每天都会剩余一些,隔夜了又
买猴子好还是买宫本好
脸上经常出油,用曼秀雷郭和露得清和妮维雅哪
050607年左右老是播的一部关于隋唐的动画片,
18岁该不该去相亲?我现在18岁了,男的。还是
UN的中文含义是什么如题.
2018年七岁上一年级大吗
永利图片社地址在什么地方,我要处理点事
小东方餐馆怎么去啊,有知道地址的么
恒指怎么做啊?
四年级语文试卷家长签名留言怎么写
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?