c語(yǔ)言數(shù)獨(dú)函數(shù) c語(yǔ)言解數(shù)獨(dú)

c語(yǔ)言 編程 數(shù)獨(dú)

當(dāng)年我們做大程的時(shí)候本來(lái)也想做數(shù)獨(dú)來(lái)著,后來(lái)時(shí)間不夠沒(méi)做成.不知道專(zhuān)業(yè)人士怎么編的,只能提供一點(diǎn)當(dāng)時(shí)的思路給你,

新鄉(xiāng)縣網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)公司2013年開(kāi)創(chuàng)至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專(zhuān)注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。

1.9*9個(gè)格子對(duì)應(yīng)一個(gè)數(shù)組A,數(shù)組的第一個(gè)值從0到9表示其中填的數(shù)字,0就是不填,另一個(gè)值表示它在桌面上的位置就是坐標(biāo)

2.需要10張圖片,空白和9個(gè)數(shù)字

3.通過(guò)對(duì)鼠標(biāo)點(diǎn)擊的反應(yīng)改變格子數(shù)組A的值,且將相應(yīng)圖片覆蓋在相應(yīng)坐標(biāo)上

4.事先輸入若干組數(shù)組A的值(每組81個(gè)數(shù)),作為題庫(kù)

5.進(jìn)行游戲時(shí)隨機(jī)抽取題庫(kù)中的一組,再隨機(jī)抽取若干格子顯示出來(lái),其他留白.

6.填完后用三個(gè)循環(huán)判斷下每行每列每塊是否有相同的數(shù)字,沒(méi)有則通過(guò).

具體編按鈕、放圖、鼠標(biāo)點(diǎn)擊響應(yīng)等各種問(wèn)題查一下書(shū),有很多書(shū)上有很多教的這種一小段一小段的程序源代碼,直接抄下就行了。

加油^^

用C語(yǔ)言怎么解數(shù)獨(dú)

#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;?iSIZE;?i++)??

{??

if(i%3==0)????

{??

for(j=0;?jSIZE*2+4;?j++)??

putchar('-');??

putchar('\n');??

}?????????

for(j=0;?jSIZE;?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;?iSIZE*2+4;?i++)??

putchar('-');??

putchar('\n');??

}??

void?sub(int?i,?int?j,?int?bit)??

{??

int?k,?m;?????

for(k=0;?kSIZE;?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;?iSIZE;?i++)??

for(j=0;?jSIZE;?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;?kSIZE;?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;?iSIZE;?i++)??

for(j=0;?jSIZE;?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;??

}

C語(yǔ)言編寫(xiě)一個(gè)3*3數(shù)獨(dú),保證每行每列的和都相等?。∏笄蟾魑淮笊窳?/h2>

/*

因?yàn)槟阏f(shuō)是數(shù)獨(dú)?可是你只表述了行列相等,如果是數(shù)獨(dú)應(yīng)該對(duì)角線(xiàn)相加也相等,所以我寫(xiě)了兩個(gè)判斷函數(shù),judge1為對(duì)角線(xiàn)也相等的情況,judge為你描述的行列和相等(情況太多了)

結(jié)題方案只需要做一次dfs就可以了,還需要配合一個(gè)棧來(lái)存儲(chǔ)dfs的路徑,將每個(gè)符合條件的路徑做一次行列和是否相等的判斷?然后輸出就是要的結(jié)果!

*/

#includestdio.h

#includememory.h

#includestdbool.h

//stack

int?a[9]={0};//a[0]--a[0][0]?a[1]--a[0][1]?and?so?on??simulate?stack

int?len=0;

//dfs

int?visited[10]={0};

bool?judge()//行列相等

{

int?i,j;

int?tmp[6]={0};

for(i=0;i3;i++)

for(j=0;j3;j++)

tmp[i]+=a[3*i+j];

for(i=0;i3;i++)

for(j=0;j3;j++)

tmp[3+i]+=a[i+3*j];

int?jud=tmp[0];

for(i=1;i6;i++)

{

if(jud!=tmp[i])

return?false;

}

return?true;

}

bool?judge1()//行列相等?對(duì)角線(xiàn)也相等

{

int?i,j;

int?tmp[8]={0};

for(i=0;i3;i++)

for(j=0;j3;j++)

tmp[i]+=a[3*i+j];

for(i=0;i3;i++)

for(j=0;j3;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;i8;i++)

{

if(jud!=tmp[i])

return?false;

}

return?true;

}

void?printa()

{

int?t,p;

for(t=0;t3;t++)

{

for(p=0;p3;p++)

{

printf("%d?",a[3*t+p]);

}

printf("\n");

}

}

void?dfs(int?i,int?v[])

{

if(i==10)//find?one?solution

{

if(judge1())//給你寫(xiě)了兩個(gè)判斷函數(shù)?如果對(duì)角線(xiàn)也相等那么用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;

}

分享標(biāo)題:c語(yǔ)言數(shù)獨(dú)函數(shù) c語(yǔ)言解數(shù)獨(dú)
本文鏈接:http://bm7419.com/article36/dohhjsg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版網(wǎng)站策劃、軟件開(kāi)發(fā)、云服務(wù)器、網(wǎng)站內(nèi)鏈、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開(kāi)發(fā)