數獨c語言
發布時間: 2024-04-24 11:05:10
A. 用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。
該代碼的思路很簡單,就是從第一行第一列開始依次填入數字,檢查是否是在同一行、同一列、同一宮有沒有填入重復數字,如果沒有就繼續填入下一個數字,如果有就返回。
雖然效率稍低,但原理簡單、表述直白、易於理解,更有效率的代碼是使用十字鏈表完成,如有興趣可繼續深入
B. 數獨 演算法 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. 用C語言怎麼解數獨
#include<stdio.h>
#include<stdlib.h>
#defineSIZE9
#defineget_low_bit(x)((~x&(x-1))+1)
struct{
intleft;
charnum;
chartry;
}board[SIZE][SIZE];
intbit2num(intbit)
{
switch(bit){
case1:case2:
returnbit;
case4:
return3;
case8:
return4;
case16:
return5;
case32:
return6;
case64:
return7;
case128:
return8;
case256:
return9;
}
}
voidprintf_res()
{
inti,j,k;
for(i=0;i<SIZE;i++)
{
if(i%3==0)
{
for(j=0;j<SIZE*2+4;j++)
putchar('-');
putchar(' ');
}
for(j=0;j<SIZE;j++)
{
if(j%3==0)
putchar('|');
if(board[i][j].num>0)
printf("