當(dāng)年我們做大程的時(shí)候本來也想做數(shù)獨(dú)來著,后來時(shí)間不夠沒做成.不知道專業(yè)人士怎么編的,只能提供一點(diǎn)當(dāng)時(shí)的思路給你,
新鄉(xiāng)縣網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)公司2013年開創(chuàng)至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。
1.9*9個(gè)格子對應(yīng)一個(gè)數(shù)組A,數(shù)組的第一個(gè)值從0到9表示其中填的數(shù)字,0就是不填,另一個(gè)值表示它在桌面上的位置就是坐標(biāo)
2.需要10張圖片,空白和9個(gè)數(shù)字
3.通過對鼠標(biāo)點(diǎn)擊的反應(yīng)改變格子數(shù)組A的值,且將相應(yīng)圖片覆蓋在相應(yīng)坐標(biāo)上
4.事先輸入若干組數(shù)組A的值(每組81個(gè)數(shù)),作為題庫
5.進(jìn)行游戲時(shí)隨機(jī)抽取題庫中的一組,再隨機(jī)抽取若干格子顯示出來,其他留白.
6.填完后用三個(gè)循環(huán)判斷下每行每列每塊是否有相同的數(shù)字,沒有則通過.
具體編按鈕、放圖、鼠標(biāo)點(diǎn)擊響應(yīng)等各種問題查一下書,有很多書上有很多教的這種一小段一小段的程序源代碼,直接抄下就行了。
加油^^
#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;??
}
/*
因?yàn)槟阏f是數(shù)獨(dú)?可是你只表述了行列相等,如果是數(shù)獨(dú)應(yīng)該對角線相加也相等,所以我寫了兩個(gè)判斷函數(shù),judge1為對角線也相等的情況,judge為你描述的行列和相等(情況太多了)
結(jié)題方案只需要做一次dfs就可以了,還需要配合一個(gè)棧來存儲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()//行列相等?對角線也相等
{
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())//給你寫了兩個(gè)判斷函數(shù)?如果對角線也相等那么用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語言數(shù)獨(dú)函數(shù) c語言解數(shù)獨(dú)
本文鏈接:http://muchs.cn/article36/dohhjsg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、網(wǎng)站策劃、軟件開發(fā)、云服務(wù)器、網(wǎng)站內(nèi)鏈、營銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)