當前位置:首頁 » 編程語言 » c語言編寫數獨

c語言編寫數獨

發布時間: 2023-08-12 19:16:49

c語言數獨問題,100分求教

花了點時間,總算寫出來了,不知道和你要的意思一不一樣,這次應該沒問題了:

#include<stdio.h>

charFlag[2][9][9]={0};
charSu[3][3][3][3]={0};

introll(introw,intcol,inti,intj,charnum,inte){
printf(" 第%d行第%d列的%c不合理!",i+1,j+1,num);
switch(e){
case5:
printf("九宮格內數字重復");
break;
case7:
printf("數獨行內數字重復");
break;
case9:
printf("數獨列內數字重復");
break;
}
printf(" (回車鍵繼續,任意字元回車退出):");
if(getchar()!=' '){
while(getchar()!=' ');
returne;
}

//清除整個數獨行列標記
char(*unit)[3]=Su[row][col];
if(e>5){
//循環整個九宮格
while(i>=0){
//循環九宮格清除行列標記
while(--j>=0){
charc=unit[i][j]-'1';
e=row*3+i;
Flag[0][e][c]=0;
e=col*3+j;
Flag[1][e][c]=0;
}
j=3;
i--;
}
}

returnsd(row,col);
}

intsd(introw,intcol){
charnum,flag[9]={0};
char(*unit)[3]=Su[row][col];

inti,j,x;
statictip=1;
if(tip){tip=0;
printf("123 456 789 請按如上格式(下同)輸入 ");
}
printf("第%d行第%d個九宮格: ",row+1,col+1);
scanf("%s %s %s",unit[0],unit[1],unit[2]);getchar();
printf("第%d行第%d個九宮格",row+1,col+1);

//循環整個九宮格
for(i=0;i<3;i++){
//循環九宮格每行是否合法
for(j=0;j<3;j++){
num=unit[i][j];
if(num<'1'||num>'9'){
printf(" 只能輸入1-9的數字!");
returnroll(row,col,i,j,num,1);
}
//判斷數獨單元是否合理
if(flag[num-'1']){
returnroll(row,col,i,j,num,5);
}else{
flag[num-'1']=1;
}
//判斷整個數獨中單元所在行是否合理
x=row*3+i;
if(Flag[0][x][num-'1']){
returnroll(row,col,i,j,num,7);
}else{
Flag[0][x][num-'1']=1;
}
//判斷整個數獨中單元所在列是否合理
x=col*3+j;
if(Flag[1][x][num-'1']){
returnroll(row,col,i,j,num,9);
}else{
Flag[1][x][num-'1']=1;
}
}
}
printf("輸入完成 ");
return0;
}

intmain(){
inti,j;
intx,y;
//循環整個數獨
for(i=0;i<3;i++){
//循環每行數獨九宮格
for(j=0;j<3;j++){
//數獨九宮格輸入和測試
if(x=sd(i,j)){
returnx;
}
}
}

printf(" 輸入全部通過");
printf(" 完整的數獨如下:");
//循環輸出整個數獨
for(x=0;x<3;x++){
printf(" ");
//循環九宮格一列
for(i=0;i<3;i++){
//輸出數獨一整行
for(y=0;y<3;y++){
//輸出九宮格一行
for(j=0;j<3;j++){
printf("%c",Su[x][y][i][j]);
}
printf("");
}
printf(" ");
}
}
return0;
}

⑵ c語言編寫的解數獨程序

#include <windows.h>
#include <stdio.h>
#include <time.h>

char sd[81];
bool isok = false;

//顯示數獨
void show()
{
if (isok) puts("求解完成");
else puts("初始化完成");

for (int i = 0; i < 81; i++)
{
putchar(sd[i] + '0');
if ((i + 1) % 9 == 0) putchar('\n');
}
putchar('\n');
}

//讀取數獨
bool Init()
{
FILE *fp = fopen("in.txt", "rb");
if (fp == NULL) return false;
fread(sd, 81, 1, fp);
fclose(fp);
for (int i = 0; i < 81; i++)
{
if (sd[i] >= '1' && sd[i] <= '9') sd[i] -= '0';
else sd[i] = 0;
}
show();
return true;
}

//遞歸解決數獨
void force(int k)
{
if (isok) return;
if (!sd[k])
{
for (int m = 1; m <= 9; m++)
{
bool mm = true;
for (int n = 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);
}
}

int main()
{
system("CLS");
if (Init())
{
double start = clock();
force(0);
printf("耗時%.0fms", clock() - start);
}
else puts("初始化錯誤");
getchar();
}

⑶ c語言 編程 數獨

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

⑷ 求用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;
}

⑸ 求用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;
}

⑹ 基於SAT的數獨游戲求解程序,求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 16:

case 256:

return 9;

基礎解法

排除法(摒除法)

摒除法:用數字去找單元內唯一可填空格,稱為摒除法,數字可填唯一空格稱為排除法 (Hidden Single)。

根據不同的作用范圍,摒余解可分為下述三種:

數字可填唯一空格在「宮」單元稱為宮排除(Hidden Single in Box),也稱宮摒除法。

數字可填唯一空格在「行」單元稱為行排除法(Hidden Single in Row),也稱行摒除法。

⑺ 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;
}

熱點內容
編譯器的製作環境 發布:2025-02-06 05:54:34 瀏覽:828
學車網源碼 發布:2025-02-06 05:47:40 瀏覽:385
搭建區域網影院伺服器 發布:2025-02-06 05:47:38 瀏覽:759
廣東一區cf刷經驗房密碼都是什麼 發布:2025-02-06 05:46:20 瀏覽:633
加密工具源碼 發布:2025-02-06 05:44:52 瀏覽:13
筆記本可用存儲多大 發布:2025-02-06 05:44:48 瀏覽:157
ftp登錄後沒有反應 發布:2025-02-06 05:29:41 瀏覽:175
linux建目錄命令 發布:2025-02-06 05:29:06 瀏覽:724
安卓所有照片在哪裡 發布:2025-02-06 05:16:32 瀏覽:972
l2緩存作用 發布:2025-02-06 05:15:02 瀏覽:291