C语言——解数独程序[源码]
来源:互联网 发布:the getaway淘宝 编辑:程序博客网 时间:2024/06/07 11:17
用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; }
0 0
- C语言——解数独程序[源码]
- C语言——解数独程序[源码]
- C语言程序解数独问题
- C语言解数独
- C程序解数独
- 数独 C语言 解数独
- 哭吧!喜欢玩数独游戏的亲们!你被取代了——C语言解数独
- 解数独算法,用C语言递归实现
- 用程序来解数独
- 解数独程序: Python实现 v0.1.1
- 解数独游戏的程序构思想法
- 使用java程序帮你解数独
- C# 解数独程序 注释详细
- Java学习:解数独的小程序
- 解数独
- 解数独
- 关于解数独程序的设计思想与方案
- 用C++实现的解数独(Sudoku)程序
- java学习方法
- 黑马程序员-----java学前总结
- Linux环境下段错误的产生原因及调试方法小结
- Myeclipse项目报错,但不影响结果ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
- ibatis的there is no statement named xxx in this SqlMap
- C语言——解数独程序[源码]
- 深入了解android平台的jni---注册native函数
- AJAX工作原理及其优缺点
- Python’s getattr function
- 无法打开物理文件xxx.mdf操作系统错误 5:“5(拒绝访问。)” (Microsoft SQL Server,错误: 5120)的解决方法
- 通过案例学调优之--动态视图(v$bh和x$bh)
- 从开发者到管理者,过来人的自述!
- Hadoop相关面试题(二)
- 联合体存储空间