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

自動填寫數獨c語言

發布時間: 2022-09-04 08:11:14

A. 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{後才在邏輯上清晰……

B. 求用C語言編一個解九宮格數獨的程序

前兩天剛寫完,還沒優化,已運行通過了.
暈,一維的好麻煩,這個也是碰巧前兩天剛寫好的,你看著自己修改下
#include
<stdio.h>
typedef
struct
{
int
line;
int
row;
int
num;
}Node;
int
main()
{
/*
int
a[9][9]={
{4,0,3,6,0,0,0,0,0},
{0,0,0,0,0,1,0,2,4},
{0,1,0,0,4,0,5,0,0},
{0,0,0,9,0,4,0,6,0},
{3,0,2,0,0,0,4,0,9},
{0,7,4,1,0,3,0,0,0},
{0,0,1,0,9,0,0,4,0},
{2,4,0,3,0,0,0,0,0},
{0,0,0,4,0,8,2,0,7}};
*/
int
a[9][9]={
{0,0,0,8,0,0,0,6,0},
{8,7,0,0,0,0,0,0,0},
{2,9,0,0,4,1,0,0,5},
{0,0,5,7,0,0,0,0,9},
{0,2,0,0,0,0,0,1,0},
{9,0,0,0,0,4,3,0,0},
{7,0,0,6,1,0,0,9,8},
{0,0,0,0,0,0,0,5,2},
{0,6,0,0,0,9,0,0,0}};
/*
int
a[9][9]={
{0,2,0,0,6,0,0,0,0},
{0,9,0,4,0,5,1,3,0},
{0,0,8,7,0,0,0,0,5},
{6,0,0,3,0,0,4,0,0},
{0,0,0,9,0,6,0,0,0},
{0,0,7,0,0,1,0,0,3},
{4,0,0,0,0,7,3,0,0},
{0,8,5,2,0,4,0,7,0},
{0,0,0,0,9,0,0,1,0}};
*/
/*
int
a[9][9]={
{0,0,3,0,2,0,0,0,6},
{0,0,2,0,9,0,0,0,4},
{7,0,0,8,0,0,2,0,3},
{0,8,0,0,7,0,5,0,0},
{0,7,0,1,0,6,0,3,0},
{0,0,0,2,0,0,0,9,0},
{4,0,6,0,0,8,0,0,5},
{6,0,0,0,4,0,3,0,0},
{9,0,0,0,1,0,7,0,0}};
*/
int
i,j,n,en,flag,y,k=0,x,qu,p,q;
Node
b[70];
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
if(!a[i][j])
{
b[k].line=i;
b[k].row=j;
b[k].num=0;
k+=1;
}
}
}
en=k;
/*從b[0]開始試,若b[k].num>9,則k-1,否則k+1*/
for(k=0;k<en;)
{
++b[k].num;
i=b[k].line;
j=b[k].row;
a[i][j]=b[k].num;
n=0;
while(n<9&&b[k].num<=9)
{
if(n==i)
{
for(y=0;y<9;y++)
{
if(y==j)
continue;
if(a[n][y]==a[i][j])
flag=1;
}
}
else
if(n==j)
{
for(y=0;y<9;y++)
{
if(y==i)
continue;
if(a[y][n]==a[i][j])
flag=1;
}
}
/*判斷同一塊中有沒有相同值*/
qu=3*(i/3)+j/3;
switch(qu)
{
case
0:x=0;
y=0;
break;
case
1:x=0;
y=3;
break;
case
2:x=0;
y=6;
break;
case
3:x=3;
y=0;
break;
case
4:x=3;
y=3;
break;
case
5:x=3;
y=6;
break;
case
6:x=6;
y=0;
break;
case
7:x=6;
y=3;
break;
default
:x=6;
y=6;
break;
}
p=x;
q=y;
for(;x<p+3;x++)
{
for(;y<q+3;y++)
{
if(x==i&&y==j)
continue;
if(a[x][y]==a[i][j])
{
flag=1;
break;
}
}
if(flag==1)
break;
}
if(flag==1)
{
a[i][j]=++b[k].num;
flag=0;
n=0;
continue;
}
n++;
}
if(b[k].num>9)
{
a[i][j]=b[k].num=0;
k--;
if(k<0)
{
printf("error!\r\n");
return
-1;
}
}
else
k++;
}
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
printf("%d",a[i][j]);
}
printf("\r\n");
}
return
1;
}

C. 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
}
}
}
}

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

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

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

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

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

E. 用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。

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

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

F. 如何C語言編寫數獨游戲

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

G. c語言 編程 數獨

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

H. 怎麼用C語言寫數獨程序

C 語言數獨解題程式原始碼動機 要如何寫個能解數獨的程式呢? 隨著數獨的風行,程式設計的老師常常以此為題,要求學生寫個解題的程式。 自數獨樂園開張以來,要求提供原始碼的要求就不曾斷過。 幫還是不幫好呢?幫了,好像在作弊,不幫又好像敝帚自珍,所以乾脆公開算了! 當然也有些人並不是為了寫作業,而是為了研究數獨,才提出此要求。這時如果能有個範例,提供一個初步的架構, 接下去的工作就簡單多了。 程式不使用任何技巧,完全採試誤法,有人會說:這樣做需要很長時間的試誤吧!程式的執行可以給你解答。 請編輯後,在命令列中將單列格式數獨放在參數中,只要有解,一定可獲得解答;如果是多重解,只解出一解就會停止。 例: sudoku 00480705203 C 語言原始碼 #include < stdio.h > #include < stdlib.h > int sudoku[81] ; // 數獨題目陣列 int tempNum[81] ; // 上一次填數位置 int tempSp= 0 ; // 上一次填數位置指標 int startH[81] ; // 列位置的起點 int startV[81] ; // 行位置的起點 int startB[81] ; // 九宮格位置的起點 int addH[9] ; // 列位置的加值 int addV[9] ; // 行位置的加值 int addB[9] ; // 九宮格位置的加值 int main(int argc, char *argv[]) { int j ; if(argc>1) for(j=0; j<81; j++) sudoku[j]= argv[1][j]-'0' ; else exit(0) ; printf( "------------------\n"); printSudoku(sudoku) ; init() ; // 參數設定 tryAns() ; // 測試求解 printf( "------------------\n"); printSudoku(sudoku) ; printf( "------------------\n"); } int init() { // 參數設定(設定這些參數之後,無論檢查行、列、九宮格都方便多了) int i ; for(i=0; i<81; i++) { startH[i]= i/9* 9 ; // 列位置的起點 startV[i]= i% 9 ; // 行位置的起點 startB[i]= ((i/9)/3)*27+ ((i%9)/3)*3 ; // 九宮格位置的起點 } for(i=0; i<9; i++) { addH[i]= i ; // 列位置的加值 addV[i]= i*9 ; // 行位置的加值 addB[i]= (i/3)*9+ (i%3) ; // 九宮格位置的加值 } } int printSudoku(int *prn) { // 印出數獨題目(陣列內容) int i ; for(i=0; i<81; i++) { printf( "%2d", prn[i]); if(i%9==8) printf("\n"); } } int tryAns() { // 測試求解 int sp=getNextBlank(-1) ; // 取得第一個空白的位置開始填入數字 do { sudoku[sp]++ ; // 將本位置數字加 1 if(sudoku[sp]>9) { // 如果本位置的數字已大於 9 時則回到上一個位置繼續測試 sudoku[sp]= 0 ; sp= pop() ; } else { if(check(sp)==0) { // 如果同行、列、九宮格都沒有相同的數字,則到下一個空白處繼續 push(sp) ; // 當然,如果發現有相同的數字時,就需把原位置的數字加 1(所以本處什麼都不做) sp= getNextBlank(sp) ; } } } while(sp>=0 && sp<81) ; } int getNextBlank(int sp) { // 取得下一個空白的位置 do { sp++ ; } while(sp<81 && sudoku[sp]>0) ; return(sp) ; } int check(int sp) { // 檢查同行、列、九宮格有沒有相同的數字,若有傳回 1 int fg= 0 ; if(!fg) fg= check1(sp, startH[sp], addH) ; // 檢查同列有沒有相同的數字 if(!fg) fg= check1(sp, startV[sp], addV) ; // 檢查同行有沒有相同的數字 if(!fg) fg= check1(sp, startB[sp], addB) ; // 檢查同九宮格有沒有相同的數字 return(fg) ; } int check1(int sp, int start, int *addnum) { // 檢查指定的行、列、九宮格有沒有相同的數字,若有傳回 1 int fg= 0, i, sp1 ; for(i=0; i<9; i++) { sp1= start+ addnum[i] ; if(sp!=sp1 && sudoku[sp]==sudoku[sp1]) fg++ ; } return(fg) ; } int push(int sp) { // 將指定的位置放入堆疊中 tempNum[tempSp++]= sp ; } int pop() { // 取出堆疊中的上一個位置 if(tempSp<0) return(-1) ; else return(tempNum[--tempSp]) ; }

記得採納啊

I. 求用C語言編寫一個解數獨的程序,急

用0代表要填的數
#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; i<SIZE; i++)
{
if(i%3==0)
{
for(j=0; j<SIZE*2+4; j++)
putchar('-');
putchar('\n');
}

for(j=0; j<SIZE; 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; i<SIZE*2+4; i++)
putchar('-');
putchar('\n');
}

void sub(int i, int j, int bit)
{
int k, m;

for(k=0; k<SIZE; 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; i<SIZE; i++)
for(j=0; j<SIZE; 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; k<SIZE; 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; i<SIZE; i++)
for(j=0; j<SIZE; 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;
}

J. C語言編寫一個3*3數獨,保證每行每列的和都相等!!求求各位大神了

/*
因為你說是數獨可是你只表述了行列相等,如果是數獨應該對角線相加也相等,所以我寫了兩個判斷函數,judge1為對角線也相等的情況,judge為你描述的行列和相等(情況太多了)
結題方案只需要做一次dfs就可以了,還需要配合一個棧來存儲dfs的路徑,將每個符合條件的路徑做一次行列和是否相等的判斷然後輸出就是要的結果!
*/
#include<stdio.h>
#include<memory.h>
#include<stdbool.h>
//stack
inta[9]={0};//a[0]--a[0][0]a[1]--a[0][1]andsoonsimulatestack
intlen=0;
//dfs
intvisited[10]={0};
booljudge()//行列相等
{
inti,j;
inttmp[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];
intjud=tmp[0];
for(i=1;i<6;i++)
{
if(jud!=tmp[i])
returnfalse;
}
returntrue;
}
booljudge1()//行列相等對角線也相等
{
inti,j;
inttmp[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];
intjud=tmp[0];
for(i=1;i<8;i++)
{
if(jud!=tmp[i])
returnfalse;
}
returntrue;
}
voidprinta()
{
intt,p;
for(t=0;t<3;t++)
{
for(p=0;p<3;p++)
{
printf("%d",a[3*t+p]);
}
printf(" ");
}
}
voiddfs(inti,intv[])
{
if(i==10)//findonesolution
{
if(judge1())//給你寫了兩個判斷函數如果對角線也相等那麼用judge1()即可判斷
printa();
return;
}

intj;
for(j=1;j<=9;j++)
{
inttmp[10];
memcpy(tmp,v,10*sizeof(int));
if(tmp[j]==0)
{
tmp[j]=1;
a[len++]=j;
//printf("%d%d ",len-1,a[len-1]);
dfs(i+1,tmp);
len--;
}

}


}
intmain(void)
{
dfs(1,visited);
return0;
}