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

c語言數獨編程思路

發布時間: 2022-09-07 07:59:33

c語言 編程 數獨

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

㈡ 如何C語言編寫數獨游戲

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

㈢ 基於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),也稱行摒除法。

㈣ 誰能告訴我數獨游戲的編程思維啊

一、解數獨
1、標記
2、利用各種方法減少標記數量,例如顯性數對刪減法、隱形唯一數法、隱形數對法、區域刪減法、區塊刪減法、三四鏈數刪減法等等
3、填充,利用唯一值法,如果那個標記中只有一個可填了,這就是結果了。
4、假設法,如果各種方法(至少你知道的)都用了還是沒有唯一數,那隻能假設了,按一定順序某個單元格標記中假設一個就是要填充的數,然後重復上面的步驟,如果得到無解(就是出現某個單元格的沒有可填的數),那就退回,換一個數繼續。(一般這個過程用遞歸完成)
二、如何生成題目
會解數獨後,生成就不是問題了,我的方法是分為兩步首先隨機填充1-9到第一行,然後用上訴方法產生一個解。再次,隨機一個一個數刪除,每刪除一個數重復上訴方法,看看是否是唯一解,如果是繼續刪除(不是就恢復,刪其它的),直到達到一定目的為止。這樣就產生一個數獨題目。

㈤ 用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。

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

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

㈥ 求助 c語言關於「數獨」的思路 在線等啊!

1 2 3 4 5 6 7 8 9
2 1 4 5 6 7 8 9 3
3 4 5
4 5
5 6
6 7
7 8
8 9
9 3
這種情況,橫豎都沒問題,但是九宮格里重復了

㈦ C語言怎麼實現解決一個數獨啊~~菜鳥求C語言大神給代碼和思路><~~好的給追加分!!

這是用遞歸方法寫的代碼
摘自http://blog.sina.com.cn/s/blog_61c5b01f0100nrta.html
我測試過一些案例
初始數據必須是正確的,一些極端情況會卡很久才有結果
一般能夠很快給出所有解
#include<stdio.h>

int result=0; //結果數

int main()
{
int a[9][9];
void Sudoku(int a[9][9],int n);
printf("請輸入數獨中的原始數據,沒有數據的用0代替。\n");
for(int i=0;i<9;i++)
{
printf("請輸入第%d行的9個數:",i+1);
for(int j=0;j<9;j++)
scanf("%d",&a[i][j]);
}
printf("數獨的解為:\n\n");
Sudoku(a,0);
if(result==0)
printf("此數獨無解!");
return 0;
}

//輸出可行的解
void print(int a[9][9])
{
result++;
printf("第%d個填法為:\n",result);
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
printf("%d ",a[i][j]);
if((j==2)||(j==5))
printf(" ");
}
printf("\n");
if((i==2)||(i==5))
printf("\n");
}
printf("\n");
}

//判斷是否可以將第i行、第j列的數設為k
bool check(int a[9][9],int i,int j,int k)
{
int m,n;
//判斷行
for(n=0;n<9;n++)
{
if(a[i][n] == k)
return false;
}
//判斷列
for(m=0;m<9;m++)
{
if(a[m][j] == k)
return false;
}
//判斷所在小九宮格
int t1=(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)
return false;
}
}
//可行,返回true
return true;
}

//數獨求解函數
void Sudoku(int a[9][9],int n)
{
int temp[9][9];
int i,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(int k=1;k<=9;k++)
{
bool flag=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
}
}
}
}

㈧ 用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("33[0;31m%2d33[0m",board[i][j].num);
else
printf("%2d",board[i][j].try);
}
printf("| ");
}
for(i=0;i<SIZE*2+4;i++)
putchar('-');
putchar(' ');
}

voidsub(inti,intj,intbit)
{
intk,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;
}

voidinit()
{
inti,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));
elseif(board[i][j].try>0)
sub(i,j,1<<(board[i][j].try-1));
}

voidadd(inti,intj,intbit)
{
intk,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;
}

voidsolve(intpos)
{
inti=pos/SIZE;
intj=pos%SIZE;
intbit,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();
}
}

intmain()
{
inti,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);

return0;
}

㈨ 求大神賜我C語言編寫「解數獨」的思路咯喂

玩過數獨都知道數獨做起來本來就很復雜,特別是到了最後還要猜數,驗證
你還在入門階段就嘗試這么復雜的問題真的很有挑戰精神呢
機解數獨的步驟:
建立一個數組
1:確定唯一數(沒有集合做的很麻煩呢,不過笨辦法還有有的,不詳寫),有些格子的數是唯一的,如果有唯一數,跳到第二步;
如果沒有,則跳得到第三步;
2:將唯一數代入數組,跳到第一步;
3:做一個循環判定,如果是空位,確定數字的可能的情況(不詳寫),在做一個選擇判斷,
情況1:選擇一個數字,跳到第一步;
情況2:選擇第二個數字,跳到第一步;
........
分太少了,樓主好好努力吧

㈩ 求數獨的編程思想

我用EXCEL的宏編過,但是演算法不太好,簡單得可以作出,難得的就不行了
想法如下:
建立一個X(a,b,c,d)的列陣,4個數為(1,2,3)中的一個
a,b表示大的33陣(就是你所說的"區")的位置
c,d表示在特定33陣(特定"區")中的位置
那麼每個特定的X表示特定的空格位置
每個X初始都=123456789
X的值表示這個空格可能取的數
然後已經給出的條件的X改為條件給出的數
現在我雖然不知道剩下的空格是哪個數,但是我可以知道特定的空格中不可以是哪個數(按規則)
step1
所以分別檢查每個空格
將不可能出現的數字從123456789中刪去(比如這個區已經存在1,4,5那麼我們把區中其他的空格的1,4,5去掉,變成2,3,6,7,8,9)
這樣X的位數就越來越小了
當X的長度等於1的時候那麼這個空格就是唯一的了
step2
檢查每一個區中的9個數中含有幾個1,如果只有1個,那麼含有1的哪個空格就是1了,(1-9,依次檢驗),(行或者列也要分別檢驗)
step3
檢查是不是每個數都小於10,如果不是
檢查經過step1和step2後,各個數字有沒有變化,如果有,那麼重復step1,step2.沒有的話(說明按剛剛的步驟只能解到這樣了)結束循環
我編的只是為了方便幫我解題,太難的做不出,但是用的話可以解出很多數了,人在看一下,很快就解出了
如果一定要編到底的話,我也想過
然後在X中尋找1個2位數,假定2位數中的一個是正確的,然後在按剛剛的步驟,如果結果有矛盾則就是另一個數
希望對你有幫助