什么是数独
数独(shù dú)是源自18世纪瑞士的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复 [1] 。
数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。
————百度百科
怎么解数独
带脑子算(手算法)
在我没上大学之前,那就是手算了,一个个数字试着填,填满了即为完成了
显然效率低而且还头疼(0.0)
不带脑子算(复读机式算法)
试着想了一下数独如何用计算机来解,于是结合一下所学
下面这段c++代码编译运行下,把数独盘面输入下就出结果了
我的贡献0%(复读题目+1%),计算机贡献99%,(•ิ_•ิ)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
| #include <bits/stdc++.h> #define MS 11 using namespace std;
int flag; char smp[MS][MS]; int mp[MS][MS],ans[MS][MS]; int vp_row[MS][MS]; int vp_col[MS][MS]; int vp_cel[4][4][MS];
int change(char c){ if('1'<=c&&c<='9') return c-'0'; else return 0; }
int check(int x,int y,int num){ int jdg_row = vp_row[x][num]; int jdg_col = vp_col[y][num]; int jdg_cel = vp_cel[x/3][y/3][num]; if(jdg_row||jdg_col||jdg_cel) return 0; return 1; }
void add_or_del_lab(int x,int y,int num,int jdg){ vp_row[x][num] = jdg; vp_col[y][num] = jdg; vp_cel[x/3][y/3][num] = jdg; }
void input_smp(){ for(int i=0;i<9;i++) gets(smp[i]); }
void into_mp(){ for(int i=0;i<9;i++){ for(int j=0;j<9;j++){ mp[i][j] = change(smp[i][j]); add_or_del_lab(i,j,mp[i][j],1); } } }
void solve(int step){
if(step==9*9){ flag = 1; printf("\n"); for(int i=0;i<9;i++){ for(int j=0;j<9;j++){ printf("%d ",ans[i][j]); } printf("\n"); } printf("\n"); }
if(mp[step/9][step%9]!=0){ ans[step/9][step%9] = mp[step/9][step%9]; solve(step+1); return; }
for(int i=1;i<=9;i++){ int now_x = step/9; int now_y = step%9; if(check(now_x,now_y,i)&&mp[now_x][now_y]==0){ add_or_del_lab(now_x,now_y,i,1); ans[now_x][now_y] = i; solve(step+1); add_or_del_lab(now_x,now_y,i,0); } } }
int main() { printf("输入你想解决的数独:\n"); printf("===================\n"); printf("注:(9*9)空缺数字用空格代替\n"); printf("===================\n"); input_smp(); into_mp(); solve(0); if(!flag) printf("未找到解,请检查输入是否正确合法\n"); return 0; }
|
然后发现网络上早已有了数独求解器(..•˘_˘•..)
复读式解数独有啥用
有利于老年痴呆~