c语言编程数独游戏,编程做数独游戏
數(shù)獨游戲非常好玩,可以訓練玩家的邏輯推理能力。數(shù)獨游戲的規(guī)則是:
1.在9×9的大九宮格內(nèi),已給定若干數(shù)字,其他宮位留白,玩家需要自己按照邏輯推敲出剩下的空格里是什么數(shù)字。
2.必須滿足的條件:每一行與每一列都有1到9的數(shù)字,每個小九宮格里也有1到9的數(shù)字,并且一個數(shù)字在每行、每列及每個小九宮格里只能出現(xiàn)一次,既不能重復也不能少。
3.每個數(shù)獨游戲都可根據(jù)給定的數(shù)字為線索,推算解答出來,而且每個數(shù)獨游戲的解答方案都是獨一無二的。如下例:
3
6
5
2
9
4
8
2
9
3
7
1
8
5
6
1
7
4
3
3
5
7
2
3
4
7
8
1
4
4
9
8
6
5
3
做數(shù)獨游戲的思路是,比如第一行,缺1,7,8三個數(shù)字。先把1拿出來,看第一行的三個空格中的一個空格所在的列及這個空格所在的小九宮,若沒有1,則這個空格有可能填1。若這一行還有其他的空格也有可能填1,則不能填1,只有這一行其他的空格不能填1時,才能確定這個空格填1。如此進行下去,直到填完所有的空格。
當然也可以先查某一列缺哪些數(shù)字,判斷這一列上的某個空格所在的行及小九宮里有沒有要填的數(shù)字,來確定填哪個數(shù)字;也可以先查某個小九宮里缺哪些數(shù)字,判斷這個小九宮里的某個空格所在的行、列有沒有要填的數(shù)字,來確定填哪個數(shù)字。這三個方法可以靈活選用,很快就能得到答案
根據(jù)上面的分析,我們可以編程讓計算機來做數(shù)獨游戲,如下面的c語言程序
main()
{
static int a[9][9]={
{0,3,6,5,2,0,0,9,4},{0,0,8,0,0,0,0,2},{0,0,9,0,3,7,1,8},
{0,5,0,0,6,1},{7,0,0,0,4,0,0,0,3},{0,0,0,3,5,0,0,7},
{0,2,3,4,7,0,8},{0,1,0,0,0,0,4},{4,9,0,0,8,6,5,3}};
int b[9],i,j,k,l,m,n,jx,jgrow,jgcol,kt,ktw,leap;
printf("\n");
for (i=0;i<9;i++) /*輸出原題*/
{
for (j=0;j<9;j++)
printf(" %d ",a[i][j]);
printf("\n");
}
jx=1;
while (jx)?/*做游戲*/
{
for(i=0;i<9;i++)
{
for(k=0;k<9;k++) b[k]=k+1;
for(j=0;j<9;j++)
if(a[i][j]!=0)
for (k=0;k<9;k++)
if(b[k]==a[i][j]) b[k]=0;/*查這一行缺哪些數(shù)字,b[0]到b[8]中不為0的數(shù)即為這一行中缺少的數(shù)*/
for (k=0;k<9;k++)
if (b[k]!=0)
{kt=0;/*可填標志量*/
for (j=0;j<9;j++)
if (a[i][j]==0)
{ leap=1;/*a[i][j]這個空格所在的列及小九宮有無要填的數(shù)字*/
for (l=0;l<9;l++)
if (a[l][j]==b[k]) leap=0;/*這一列有這個數(shù),不可填*/
jgrow=(i/3)*3;jgcol=(j/3)*3;
for (l=0;l<3;l++)
for (m=0;m<3;m++)
if(a[jgrow+l][jgcol+m]==b[k]) leap=0;/*小九宮內(nèi)有這個數(shù),不可填*/
if (leap) {kt++;if (kt==1) ktw=j;} /*第一次可以填時,記下坐標。*/
}
if (kt==1) {a[i][ktw]=b[k];kt=0;} /*填一個數(shù)字*/
}
}
jx=0;
for(i=0;i<9;i++)
for(j=0;j<9;j++)
if (a[i][j]==0) jx=1;
}
printf("\n");
for (i=0;i<9;i++)
{ for (j=0;j<9;j++)
printf(" %d ",a[i][j]);
printf("\n");
}
}
上面的程序的算法,是先查找每一行上缺哪一個數(shù)字,然后判斷每一個所缺的數(shù)字能否填在這一行的空格上,能填的立即填上,不能填的等下一輪查找時繼續(xù)判斷,直到填完所有的空格。
我們?nèi)粢炔檎颐恳涣猩先蹦囊粋€數(shù)字,與上面的程序類似,可寫出下面的程序,只是要特別注意數(shù)組的下標。
main()
{
static int a[9][9]={
{0,3,6,5,2,0,0,9,4},{0,0,8,0,0,0,0,2},{0,0,9,0,3,7,1,8},
{0,5,0,0,6,1},{7,0,0,0,4,0,0,0,3},{0,0,0,3,5,0,0,7},
{0,2,3,4,7,0,8},{0,1,0,0,0,0,4},{4,9,0,0,8,6,5,3}};
int b[9],i,j,k,l,m,jx,jgrow,jgcol,kt,ktw,leap;
printf("\n");
for (i=0;i<9;i++)
{ for (j=0;j<9;j++)
printf(" %d ",a[i][j]);
printf("\n");
}
jx=1;
while (jx)
{
for(i=0;i<9;i++)
{
for(k=0;k<9;k++) b[k]=k+1;
for(j=0;j<9;j++)
if(a[j][i]!=0)
for (k=0;k<9;k++)
if(b[k]==a[j][i]) b[k]=0;
for (k=0;k<9;k++)
if (b[k]!=0)
{
kt=0;
for (j=0;j<9;j++)
if (a[j][i]==0)
{
leap=1;
for (l=0;l<9;l++)
if (a[j][l]==b[k]) leap=0;
jgrow=(j/3)*3;jgcol=(i/3)*3;
for (l=0;l<3;l++)
for (m=0;m<3;m++)
if (a[jgrow+l][jgcol+m]==b[k]) leap=0;
if (leap) {kt++;if (kt==1) ktw=j;}
}
if (kt==1) {a[ktw][i]=b[k];kt=0;}
}
}
jx=0;
for(i=0;i<9;i++)
for(j=0;j<9;j++)
if(a[i][j]==0) jx=1;
}
printf("\n");
for (i=0;i<9;i++)
{ for (j=0;j<9;j++)
printf(" %d ",a[i][j]);
printf("\n");
}
}
我們?nèi)粢炔檎颐恳粋€小九宮里缺哪幾個數(shù)字,與上面的程序類似,可寫出下面的程序:
main()
{
static int a[9][9]={ {0,3,6,5,2,0,0,9,4},{0,0,8,0,0,0,0,2,6},{0,0,9,0,3,7,1,8},{0,5,0,0,6,1},{7,0,0,0,4,0,0,0,3},{0,0,0,3,5,0,0,7},{0,2,3,4,7,0,8},{0,1,0,0,0,0,4},{4,9,0,0,8,6,5,3}};
int b[9],i,j,k,l,m,p,q,jx,kt,ktrow,ktcol,leap;
printf("\n");
for (i=0;i<9;i++)
{ for (j=0;j<9;j++)
printf(" %d ",a[i][j]);
printf("\n");
}
jx=1;
while (jx)
{
for (i=0;i<9;i+=3)
{
for (j=0;j<9;j+=3)
{
for(k=0;k<9;k++) b[k]=k+1;
for (l=i;l
for (m=j;m
for (k=0;k<9;k++)
if (b[k]==a[l][m]) b[k]=0;
for (k=0;k<9;k++)
if (b[k]!=0)
{
kt=0;
for (l=i;l
for (m=j;m
if (a[l][m]==0)
{
leap=1;
for (p=0;p<9;p++)
if (a[l][p]==b[k]) leap=0;
for (p=0;p<9;p++)
if (a[p][m]==b[k]) leap=0;
if (leap) {kt++;if (kt==1) ktrow=l,ktcol=m;}
}
if (kt==1) {a[ktrow][ktcol]=b[k];kt=0;}
}
}
}
jx=0;
for (i=0;i<9;i++)
for (j=0;j<9;j++)
if (a[i][j]==0) jx=1;
}
printf("\n");
for (i=0;i<9;i++)
{ for (j=0;j<9;j++)
printf(" %d ",a[i][j]);
printf("\n");
}
}
上面的三個程序(已通過驗證)可單獨運行,也可以組合在一塊,提高效率。上題的答案如下:
1
3
6
5
2
8
7
9
4
5
7
8
9
1
4
3
2
6
2
4
9
6
3
7
1
8
5
3
5
2
7
6
1
9
4
8
7
6
1
8
4
9
2
5
3
9
8
4
3
5
2
6
7
1
6
2
3
4
7
5
8
1
9
8
1
5
2
9
3
4
6
7
4
9
7
1
8
6
5
3
2
下面的數(shù)獨游戲,你會做嗎?
1
9
2
2
5
3
6
1
8
9
3
2
3
5
7
1
4
9
7
9
5
1
7
9
2
5
4
9
3
8
(答案)
1
7
9
8
6
4
5
2
3
2
4
8
5
3
9
7
6
1
3
5
6
1
7
2
8
4
9
9
1
4
6
5
3
2
8
7
8
3
5
7
2
1
4
9
6
6
2
7
9
4
8
1
3
5
4
6
1
3
8
7
9
5
2
7
8
3
2
9
5
6
1
4
5
9
2
4
1
6
2
7
8
總結
以上是生活随笔為你收集整理的c语言编程数独游戏,编程做数独游戏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 比例系数什么意思 比例系数解释
- 下一篇: 中国四大古琴 中国四大古琴是什么