㈠ 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("