温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C语言只能实现解数独程序

发布时间:2022-04-02 14:34:17 来源:亿速云 阅读:122 作者:iii 栏目:移动开发

这篇文章主要介绍“C语言只能实现解数独程序”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言只能实现解数独程序”文章能帮助大家解决问题。

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

效果如图:

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

C语言只能实现解数独程序

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

C语言只能实现解数独程序

程序源码如下:

#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;
}

关于“C语言只能实现解数独程序”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI