亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言數獨游戲的求解方法

2020-01-26 13:33:29
字體:
來源:轉載
供稿:網友

數獨游戲的解法:

先將數獨分為九個格子,用一個數組將每個小九宮格的候選數存放下來,將候選數挨個放進數獨里的空位,如果這一行和這一列都沒有這個數字,繼續放入下一個,如果不能放入的話就回到上一步繼續嘗試,直到成功求出數獨的解為止;

比如這個數獨第一個九宮格的候選數就有1,2,7,8,9,我們需要從1開始放入第一個格子挨個嘗試直到8的時候發現剩下的兩個格子都不能放入


這個時候我們就要撤回上一個插入的7,發現8仍然不能放入,就繼續撤回2,發現8可以放入,就將8放入3號位置,然后將9插入

這個時候我們發現2不能放入剩下的兩格,我們就繼續撤回到1插入的時候,將2放入1號位置,然后挨個放入剩下的數

循環這一過程,直到數獨求出解為止;

這個方法比較容易想到,操作也比較容易實現

下面是代碼

代碼大多數都寫了備注便于理解

題目需要的1000道題放在下面了,將這1000個txt文件拷到EXE文件同一目錄就可以了

題目鏈接:數獨題目

#include <stdio.h>#include <stdlib.h>#include <string.h> #define MAX 81typedef struct asd{ int x;//待測試的值的x坐標  int y;//待測試的值的y坐標  int p;//待測試的值的位置(1道9代表在九宮格里的位置)  int n;//待測試的值}A;A zhan[MAX];//存放每個放進題目數組測試的數據 void kongque(int queshi[9][9],int aa[9][9]);//函數將候選數數組里去除題目中有的數字 void shuchu(int aa[9][9],int q);//輸出整個數組到文件中 int end(int aa[9][9]); //判斷是否結束 int next(int queshi[9][9],int m,int n,int *x,int *y,int aa[9][9]);//查找下一個應該放進九宮格測試的數據 int chazhao(int aa[9][9],int m,int n,int num);//查找同一行同一列是否有相同的值 int nfrz(int queshi[9][9],int aa[9][9],int m,int n,int *p);//判斷是否滿足入棧條件(就是當前值是否可以插入九宮格) int rz(int *t,int x,int y,int p,int num);//入棧操作 int cz(int *t,int *x,int *y,int *p,int *num);//出棧操作 void aaaa(char aa[10],int a);//計算題目文件的文件名 void bbbb(char aa[10],int a);//計算答案文件的文件名int main(){ int i;//記錄該調用哪道題  for(i=0;i<1000;i++){ int aa[9][9],j,k;//aa數組存放的是題目數獨  int queshi[9][9];//存放的是每個九宮格的待選數  int end=0;//判斷循環結束條件  int h=0,l=0,p=1;//h是候選數的行坐標,l是候選數的列坐標,p代表當前測試數屬于小九宮格的位置  int t=-1;//棧的長度  int s=0,num; FILE *u; char qwe[10]; for(j=0;j<9;j++)//將數組置為每行都是(1到9)  for(k=0;k<9;k++) queshi[j][k]=k+1; aaaa(qwe,i); u=fopen(qwe,"r"); for(j=0;j<9;j++){//讀入題目  for(k=0;k<9;k++){ fscanf(u,"%d",&aa[j][k]); } } fclose(u); memset(zhan,0,sizeof(zhan));//將棧的數據全部置為0  kongque(queshi,aa); while(end!=1){//開始求解  s=next(queshi,h,l,&h,&l,aa);//查找下一個應該放進九宮格測試的數據 if(s==0){//如果找到則進入下一層  s=nfrz(queshi,aa,h,l,&p);//判斷能否插入數獨里  if(s==0){//如果可以則將插入的數據存放到棧里(入棧)   s=rz(&t,h,l,p,queshi[h][l]);  if(s==0){ //如果入棧成功則寫入數獨  aa[h/3*3+(p-1)/3][h%3*3+(p-1)%3]=queshi[h][l];  l++;//待選數跳到下一個   p=1;//重新從第一個小格子開始判斷是否插入   }  else{  end=1;//循環結束   } } else{  s=cz(&t,&h,&l,&p,&num);  if(s==0){//如果出棧成功則擦除插入的數據   aa[h/3*3+(p-1)/3][h%3*3+(p-1)%3]=0;  p++;  }  else  end=1; } } else if(s==-1){ shuchu(aa,i);//輸出求解完畢的數獨  end=1;  } else{ printf("發生未知錯誤"); end=1; } } } return 0;}//函數將候選數數組里去除題目中有的數字 void kongque(int queshi[9][9],int aa[9][9]){ int i,j,x,y; for(i=0;i<j;i++){ for(j=0;j<9;j++){ if(aa[i][j]){ x=i/3*3+j/3;//數獨數組和候選數數組的坐標轉換  y=aa[i][j]-1; queshi[x][y]=0; } } }}//輸出整個數組到文件中void shuchu(int aa[9][9],int q){ int i,j; FILE *p; char qq[10]; bbbb(qq,q); p=fopen(qq,"w"); for(i=0;i<9;i++){ for(j=0;j<9;j++){ fprintf(p,"%d ",aa[i][j]); } fprintf(p,"/n"); } fclose(p);}//判斷是否結束int end(int aa[9][9]){ int i,j,num=0; for(i=0;i<9;i++){ num=0; for(j=0;j<0;j++){ num+=aa[i][j];//檢查每一行是否為1到9  } if(num!=45) return -1; } for(j=0;j<9;j++){//檢查每一列是否為1到9  num=0; for(i=0;i<9;i++){ num+=aa[i][j]; } if(num!=45) return -1; } return 0;}//查找下一個應該放進九宮格測試的數據 int next(int queshi[9][9],int m,int n,int *x,int *y,int aa[9][9]){ int qqq=0; if(n>8){//如果當前小九宮格填寫完畢則進入下一個九宮格  n=0; m++; } if(m>8){ qqq=end(aa);//判斷是否結束  if(qqq!=0) return -1; else return 1; } while(queshi[m][n]==0){ if(n<8) n++; else{ n=0; m++; if(m>8){ qqq=end(aa); if(qqq!=0)  return -1; else  return 1; } } } *x=m;//重新獲取測試的值的x坐標和y坐標  *y=n; return 0;}//查找同一行同一列是否有相同的值 int chazhao(int aa[9][9],int m,int n,int num){ int i; for(i=0;i<9;i++){//查找行  if(aa[m][i]==num) return -1; } for(i=0;i<9;i++){//查找列  if(aa[i][n]==num) return -1; } return 0;}//判斷是否滿足入棧條件(就是當前值是否可以插入九宮格) int nfrz(int queshi[9][9],int aa[9][9],int m,int n,int *p){ int s=*p; int i,t1,t2,num; num=queshi[m][n]; for(i=s;i<10;i++){ t1=(m/3)*3+(s-1)/3; t2=(m%3)*3+(s-1)%3; if(aa[t1][t2]!=0){ s++; continue; } if(chazhao(aa,t1,t2,num)!=0){ s++; continue; } else{ *p=s; return 0; } } return -1;}//入棧操作 int rz(int *t,int x,int y,int p,int num){ if(*t>=MAX){ return -1; } else{ (*t)++; zhan[*t].x=x; zhan[*t].y=y; zhan[*t].p=p; zhan[*t].n=num; return 0; }}//出棧操作 int cz(int *t,int *x,int *y,int *p,int *num){ if(*t==-1){ return -1; } else{ *x=zhan[*t].x; *y=zhan[*t].y; *p=zhan[*t].p; *num=zhan[*t].n; (*t)--; return 0; }}//計算題目文件的文件名 void aaaa(char aa[10],int a){ if(a>=0&&a<10){ aa[0]='0'; aa[1]='0'; aa[2]='0'; aa[3]=a+'0'; } else if(a<100){ aa[0]='0'; aa[1]='0'; aa[2]=a/10+'0'; aa[3]=a%10+'0'; } else if(a<1000){ aa[0]='0'; aa[1]=a/100+'0'; aa[2]=a/10%10+'0'; aa[3]=a%10+'0'; } aa[4]='.'; aa[5]='t'; aa[6]='x'; aa[7]='t'; aa[8]='/0';}//計算答案文件的文件名void bbbb(char aa[10],int a){ if(a>=0&&a<10){ aa[0]='a'; aa[1]='0'; aa[2]='0'; aa[3]=a+'0'; } else if(a<100){ aa[0]='a'; aa[1]='0'; aa[2]=a/10+'0'; aa[3]=a%10+'0'; } else if(a<1000){ aa[0]='a'; aa[1]=a/100+'0'; aa[2]=a/10%10+'0'; aa[3]=a%10+'0'; } aa[4]='.'; aa[5]='t'; aa[6]='x'; aa[7]='t'; aa[8]='/0';}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
红桃av永久久久| 成人日韩在线电影| 日本欧美爱爱爱| 色狠狠av一区二区三区香蕉蜜桃| 国产精品日韩在线| 国产一区二区三区视频在线观看| 国产成人涩涩涩视频在线观看| 丝袜美腿亚洲一区二区| 国产噜噜噜噜久久久久久久久| 秋霞成人午夜鲁丝一区二区三区| 国产精品久久久久久av福利| 中文字幕视频一区二区在线有码| 亚洲精品久久久久中文字幕二区| 伊人男人综合视频网| 欧美激情免费在线| 欧美一区二区三区精品电影| 精品在线欧美视频| 超碰日本道色综合久久综合| 日韩精品一二三四区| 亚洲欧美精品一区| 成人黄色免费看| 欧美成人午夜视频| 亚洲一区二区三区在线免费观看| 岛国视频午夜一区免费在线观看| 一道本无吗dⅴd在线播放一区| 欧美精品久久一区二区| 日韩av在线免播放器| 欧美午夜宅男影院在线观看| 国产精品最新在线观看| 欧美情侣性视频| 亚洲一区二区久久久| 亚洲美女自拍视频| 亚洲跨种族黑人xxx| 色综合91久久精品中文字幕| 日韩激情视频在线播放| 中文字幕综合一区| 欧美成人亚洲成人| 日韩av在线资源| 国产精品爽爽爽爽爽爽在线观看| 高清一区二区三区日本久| 欧美一区二区三区四区在线| 在线亚洲男人天堂| 久久久免费观看| 国产一区红桃视频| 国产精品免费视频久久久| 亚洲成人激情图| 亚洲最大中文字幕| 亚洲永久在线观看| 国产精品久久久久久久美男| 亚洲性生活视频| 成人做爽爽免费视频| 国产综合香蕉五月婷在线| 亚洲91精品在线观看| 福利精品视频在线| 国产一区二区丝袜高跟鞋图片| 日韩大胆人体377p| 麻豆国产精品va在线观看不卡| 97国产suv精品一区二区62| 久久全球大尺度高清视频| 国产精品视频男人的天堂| 久久久久久久久久婷婷| 国产精品一区二区久久精品| 欧美在线激情视频| 亚洲日本中文字幕免费在线不卡| 国产小视频国产精品| 国产一区二区在线免费| 久久久久久久影院| 精品国产欧美成人夜夜嗨| 国产成人精品视频在线| 久久久免费av| 久久精品久久久久久国产 免费| 精品中文字幕在线观看| 日韩精品在线第一页| 欧美激情三级免费| 国产噜噜噜噜噜久久久久久久久| 欧美成人在线影院| 国产日韩欧美在线看| 欧美激情精品久久久| 亚洲人成在线观| 亚洲欧美日韩精品久久奇米色影视| 另类少妇人与禽zozz0性伦| 日韩美女视频在线观看| 欧美日产国产成人免费图片| 日韩精品视频中文在线观看| 久久精品男人天堂| 亚洲欧美中文日韩v在线观看| 狠狠爱在线视频一区| 国产91av在线| 欧美视频在线看| 欧美美女操人视频| 欧美日韩在线影院| 国语自产精品视频在线看| 久久国产精品久久精品| 亚洲无av在线中文字幕| 国产日韩在线看| 日韩精品在线视频观看| 日韩专区在线观看| 国产精品久久久久久久午夜| 在线中文字幕日韩| 欧美成人黄色小视频| 日韩精品视频在线观看免费| 一区二区成人av| 国产精品视频专区| 国模精品一区二区三区色天香| 久久亚洲精品中文字幕冲田杏梨| 国产97在线播放| 亚洲视频在线播放| 97国产精品人人爽人人做| www.欧美精品一二三区| 日韩欧美国产网站| 成人欧美在线观看| 国产精品成熟老女人| 亚洲欧洲国产伦综合| 一夜七次郎国产精品亚洲| 亚洲美女av在线| 久久精品一偷一偷国产| 97av在线播放| 欧美精品精品精品精品免费| 欧美疯狂xxxx大交乱88av| 久久综合九色九九| 78m国产成人精品视频| 欧美国产日韩免费| 亚洲激情久久久| 免费99精品国产自在在线| 欧美在线视频网站| 日韩精品视频在线| 国产做受高潮69| 国产精品爱久久久久久久| 欧美一级片在线播放| 久久影视电视剧免费网站| 欧美日韩亚洲一区二区三区| 国产精品三级美女白浆呻吟| 亚洲欧美999| 国产欧美婷婷中文| 亚洲四色影视在线观看| 97视频国产在线| 亚洲第一中文字幕在线观看| 亚洲一区二区三区四区在线播放| 欧美精品videosex牲欧美| 国产亚洲精品久久久久久777| 日韩av在线最新| 国产精品丝袜久久久久久不卡| 黄色成人av在线| 久久精品99久久久香蕉| 午夜精品久久久久久99热软件| 久久亚洲精品一区| 亚洲伊人久久大香线蕉av| 日韩精品中文字幕久久臀| 国产69精品久久久久99| 黄色一区二区在线观看| 亚洲国产97在线精品一区| 日韩精品在线看| 久久99视频免费| 亚洲老头老太hd| 久久亚洲私人国产精品va| 成人福利网站在线观看11| 姬川优奈aav一区二区| 久久久国产精彩视频美女艺术照福利| 亚洲欧美色婷婷| 日韩在线欧美在线国产在线| 91精品中文在线| 在线播放国产一区二区三区| 日韩美女免费线视频| 亚洲欧美成人精品|