當前位置:首頁 » 編程語言 » c語言生成數獨
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言生成數獨

發布時間: 2022-08-27 04:30:50

c語言 隨機生成數獨

check()函數的do...while循環有深層次邏輯錯誤:當if((rawflag==1)||(colflag==1))為「真」後的某種情況就出現rawflag和colflag不可能同時出現0而導致死循環。寫法上if((rawflag==1)||(colflag==1))
{
a[raw][col]=rand()%9+1;
}
else
break;
}
和while((rawflag==1)||(colflag==1));就不協調,好像把if語句刪除,把它的體a[raw][col]=rand()%9+1;直接寫在do{後才在邏輯上清晰……

㈡ 如何C語言編寫數獨游戲

當年我們做大程的時候本來也想做數獨來著,後來時間不夠沒做成.不知道專業人士怎麼編的,只能提供一點當時的思路給你,
1.9*9個格子對應一個數組A,數組的第一個值從0到9表示其中填的數字,0就是不填,另一個值表示它在桌面上的位置就是坐標
2.需要10張圖片,空白和9個數字
3.通過對滑鼠點擊的反應改變格子數組A的值,且將相應圖片覆蓋在相應坐標上
4.事先輸入若干組數組A的值(每組81個數),作為題庫
5.進行游戲時隨機抽取題庫中的一組,再隨機抽取若干格子顯示出來,其他留白.
6.填完後用三個循環判斷下每行每列每塊是否有相同的數字,沒有則通過.
具體編按鈕、放圖、滑鼠點擊響應等各種問題查一下書,有很多書上有很多教的這種一小段一小段的程序源代碼,直接抄下就行了。
加油^^

㈢ 用C語言如何隨機生成一個數獨

這個還真不好搞,不過我當初寫數獨游戲的時候隨便搗鼓出來過一個,你自己去改改吧,至於這個演算法能不能生成所有的數獨,我還真沒論證過。原理:對一個給出的數獨棋盤的所有行或列交換給出的兩個數X、Y,數組仍滿足數獨規則。如給出1、2,則對所有列交換1、2的位置,數組仍滿足數獨規則。由於對棋盤的演進是隨機的,所以相當於隨機生成數獨棋盤啦。每次演進的次數最好大一點,10次以上吧,以保證每個數都被換過位置。具體代碼就不用我寫了吧,嘎嘎……追問不用生成所有數獨。。只要生成一個唯一解的就好。。。

㈣ 江湖救急!!!關於C語言編寫數獨的問題。

你的j=-1,執行zhuge(a,i,j,p)是a[i][j]就為a[0][-1],這兒不就 出錯了嗎?

㈤ 數獨 演算法 C語言 代碼

一、步驟:
1.對每一個空格,根據規則推斷它可能填入的數字,並存儲它的所有可能值;
2.根據可能值的個數,確定填寫的順序。比如說,有些空格只有一種可能,那必然是正確的結果,首先填入。
3.將所有隻有一種可能的空格填寫完畢以後,回到步驟1,重新確定剩下空格的可能值;
4.當沒有隻有一種可能的空格時(即每個空格都有兩種以上可能),按照可能值個數從小到大的順序,使用深度(廣度)優先搜索,完成剩下空格。

二、常式:

#include<windows.h>
#include<stdio.h>
#include<time.h>

charsd[81];
boolisok=false;

//顯示數獨
voidshow()
{
if(isok)puts("求解完成");
elseputs("初始化完成");

for(inti=0;i<81;i++)
{
putchar(sd[i]+'0');
if((i+1)%9==0)putchar(' ');
}
putchar(' ');
}

//讀取數獨
boolInit()
{
FILE*fp=fopen("in.txt","rb");
if(fp==NULL)returnfalse;
fread(sd,81,1,fp);
fclose(fp);
for(inti=0;i<81;i++)
{
if(sd[i]>='1'&&sd[i]<='9')sd[i]-='0';
elsesd[i]=0;
}
show();
returntrue;
}

//遞歸解決數獨
voidforce(intk)
{
if(isok)return;
if(!sd[k])
{
for(intm=1;m<=9;m++)
{
boolmm=true;
for(intn=0;n<9;n++)
{
if((m==sd[k/27*27+(k%9/3)*3+n+n/3*6])||(m==sd[9*n+k%9])||(m==sd[k/9*9+n]))
{
mm=false;
break;
}
}
if(mm)
{
sd[k]=m;
if(k==80)
{
isok=true;
show();
return;
}
force(k+1);
}
}
sd[k]=0;
}
else
{
if(k==80)
{
isok=true;
show();
return;
}
force(k+1);
}
}

intmain()
{
system("CLS");
if(Init())
{
doublestart=clock();
force(0);
printf("耗時%.0fms",clock()-start);
}
elseputs("初始化錯誤");
getchar();
}

㈥ 用c語言寫一個簡易數獨的思路。要代碼

#include<stdio.h>
intnum[9][9],xy[9][9];
intcheck(intx,inty){
inti,m,n;
for(i=0;i<9;i++)
if((xy[x][y]==xy[i][y]&&i!=x)||(xy[x][y]==xy[x][i]&&i!=y))
return0;
for(i=0,m=x/3*3,n=y/3*3;i<9;i++)
if(xy[x][y]==xy[m+i/3][n+i%3]&&m+i/3!=x&&n+i%3!=y)
return0;
return1;
}
voidsearch(intx,inty){
if(x==9)
for(x=0;x<9;x++){
for(y=0;y<9;y++)
printf("%d",xy[x][y]);
printf(" ");
}
elseif(num[x][y])
search(x+(y+1)/9,(y+1)%9);
else
for(xy[x][y]=1;xy[x][y]<=9;xy[x][y]++)
if(check(x,y))
search(x+(y+1)/9,(y+1)%9);
return;
}
intmain(){
inti,j;
for(i=0;i<9;i++)
for(j=0;j<9;j++){
scanf("%d",&num[i][j]);
xy[i][j]=num[i][j];
}
search(0,0);
return0;
}

輸入為9行9列整數,已知的整數填寫對應的數字,尚待計算的未知數字填寫0。

該代碼的思路很簡單,就是從第一行第一列開始依次填入數字,檢查是否是在同一行、同一列、同一宮有沒有填入重復數字,如果沒有就繼續填入下一個數字,如果有就返回。

雖然效率稍低,但原理簡單、表述直白、易於理解,更有效率的代碼是使用十字鏈表完成,如有興趣可繼續深入

㈦ C語言簡單數獨.一個3行3列的二維數組當滿足下列條件時表明它能構成一個簡單數獨:

#include<stdio.h>#include<memory.h>#include<stdbool.h>//stackint a[9]={0};//a[0]--a[0][0] a[1]--a[0][1] and so on simulate stackint len=0;//dfsint visited[10]={0};bool judge()//行列相等{ int i,j; int tmp[6]={0}; for(i=0;i<3;i++) for(j=0;j<3;j++) tmp[i]+=a[3*i+j]; for(i=0;i<3;i++) for(j=0;j<3;j++) tmp[3+i]+=a[i+3*j]; int jud=tmp[0]; for(i=1;i<6;i++) { if(jud!=tmp[i]) return false; } return true;}bool judge1()//行列相等 對角線也相等{ int i,j; int tmp[8]={0}; for(i=0;i<3;i++) for(j=0;j<3;j++) tmp[i]+=a[3*i+j]; for(i=0;i<3;i++) for(j=0;j<3;j++) tmp[3+i]+=a[i+3*j]; tmp[7]=a[0]+a[4]+a[8]; tmp[6]=a[2]+a[4]+a[6]; int jud=tmp[0]; for(i=1;i<8;i++) { if(jud!=tmp[i]) return false; } return true;}void printa(){ int t,p; for(t=0;t<3;t++) { for(p=0;p<3;p++) { printf("%d ",a[3*t+p]); } printf("\n"); }}void dfs(int i,int v[]){ if(i==10)//find one solution { if(judge1())//給你寫了兩個判斷函數 如果對角線也相等那麼用judge1()即可判斷 printa(); return; } int j; for(j=1;j<=9;j++) { int tmp[10]; memcpy(tmp,v,10*sizeof(int)); if(tmp[j]==0) { tmp[j]=1; a[len++]=j; //printf("%d %d\n",len-1,a[len-1]); dfs(i+1,tmp); len--; } } }int main(void){ dfs(1,visited); return 0;}

㈧ 用C語言如何隨機生成一個數獨

數獨生成演算法?這個還真不好搞,不過我當初寫數獨游戲的時候隨便搗鼓出來過一個,你自己去改改吧,至於這個演算法能不能生成所有的數獨,我還真沒論證過。

原理:對一個給出的數獨棋盤的所有行或列交換給出的兩個數X、Y,數組仍滿足數獨規則。如給出1、2,則對所有列交換1、2的位置,數組仍滿足數獨規則。

由於對棋盤的演進是隨機的,所以相當於隨機生成數獨棋盤啦。每次演進的次數最好大一點,10次以上吧,以保證每個數都被換過位置。

具體代碼就不用我寫了吧,嘎嘎……

㈨ c語言 輸入九個數,生成一個完整數獨9*9

#include<stdio.h>
intresult=0;//結果數
intmain()
{
inta[9][9];
voidSudoku(inta[9][9],intn);
printf("請輸入數獨中的原始數據,沒有數據的用0代替。 ");
for(inti=0;i<9;i++)
{
printf("請輸入第%d行的9個數:",i+1);
for(intj=0;j<9;j++)
scanf("%d",&a[i][j]);
}
printf("數獨的解為: ");
Sudoku(a,0);
if(result==0)
printf("此數獨無解!");
return0;
}
//輸出可行的解
voidprint(inta[9][9])
{
result++;
printf("第%d個填法為: ",result);
for(inti=0;i<9;i++)
{
for(intj=0;j<9;j++)
{
printf("%d",a[i][j]);
if((j==2)||(j==5))
printf("");
}
printf(" ");
if((i==2)||(i==5))
printf(" ");
}
printf(" ");
}
//判斷是否可以將第i行、第j列的數設為k
boolcheck(inta[9][9],inti,intj,intk)
{
intm,n;
//判斷行
for(n=0;n<9;n++)
{
if(a[i][n]==k)
returnfalse;
}
//判斷列
for(m=0;m<9;m++)
{
if(a[m][j]==k)
returnfalse;
}
//判斷所在小九宮格
intt1=(i/3)*3,t2=(j/3)*3;
for(m=t1;m<t1+3;m++)
{
for(n=t2;n<t2+3;n++)
{
if(a[m][n]==k)
returnfalse;
}
}
//可行,返回true
returntrue;
}
//數獨求解函數
voidSudoku(inta[9][9],intn)
{
inttemp[9][9];
inti,j;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
temp[i][j]=a[i][j];
}
i=n/9;j=n%9;//求出第n個數的行數和列數
if(a[i][j]!=0)//已經有原始數據
{
if(n==80)//是最後一個格子,輸出可行解
print(temp);
else//不是最後一個格子,求下一個格子
Sudoku(temp,n+1);
}
else//沒有數據
{
for(intk=1;k<=9;k++)
{
boolflag=check(temp,i,j,k);
if(flag)//第i行、第j列可以是k
{
temp[i][j]=k;//設為k
if(n==80)
print(temp);
else
Sudoku(temp,n+1);
temp[i][j]=0;//恢復為0,判斷下一個k
}
}
}
}