C语言——解数独程序[源码]

用C语言写的解数独的程序。在linux下测试成功运行。

效果如图:

这是带解的数独,需要填写的部分用数字0代替。

这是程序运行后的效果图。看看,数独已经搞定啦~~~


程序源码如下:

用C语言写的解数独的程序。在linux下测试成功运行。
效果如图:
这是带解的数独,需要填写的部分用数字0代替。

这是程序运行后的效果图。看看,数独已经搞定啦~~~


程序源码如下:
#include <stdio.h>  
#include <stdlib.h>  
  
#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<SIZE; i++)  
    {  
        if(i%3==0)    
        {  
            for(j=0; j<SIZE*2+4; j++)  
                putchar('-');  
            putchar('\n');  
        }         
          
        for(j=0; j<SIZE; 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<SIZE*2+4; i++)  
        putchar('-');  
    putchar('\n');  
}  
  
void sub(int i, int j, int bit)  
{  
    int k, m;     
      
    for(k=0; k<SIZE; 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<SIZE; i++)  
        for(j=0; j<SIZE; 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<SIZE; 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<SIZE; i++)  
        for(j=0; j<SIZE; 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;  
}  



  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值