c語言編輯數獨,數獨c語言程序

本文目錄一覽:

求用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;i9;i++)

{

for(j=0;j9;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].num9,則k-1,否則k+1*/

for(k=0;ken;)

{

++b[k].num;

i=b[k].line;

j=b[k].row;

a[i][j]=b[k].num;

n=0;

while(n9b[k].num=9)

{

if(n==i)

{

for(y=0;y9;y++)

{

if(y==j)

continue;

if(a[n][y]==a[i][j])

flag=1;

}

}

else if(n==j)

{

for(y=0;y9;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(;xp+3;x++)

{

for(;yq+3;y++)

{

if(x==iy==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].num9)

{

a[i][j]=b[k].num=0;

k–;

if(k0)

{

printf(“error!\r\n”);

return -1;

}

}

else

k++;

}

for(i=0;i9;i++)

{

for(j=0;j9;j++)

{

printf(“%d”,a[i][j]);

}

printf(“\r\n”);

}

return 1;

}

數獨 算法 C語言 代碼

一、步驟:

1.對每一個空格,根據規則推斷它可能填入的數字,並存儲它的所有可能值;

2.根據可能值的個數,確定填寫的順序。比如說,有些空格只有一種可能,那必然是正確的結果,首先填入。

3.將所有隻有一種可能的空格填寫完畢以後,回到步驟1,重新確定剩下空格的可能值;

4.當沒有隻有一種可能的空格時(即每個空格都有兩種以上可能),按照可能值個數從小到大的順序,使用深度(廣度)優先搜索,完成剩下空格。

二、例程:

#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語言寫一個簡易數獨的思路。要代碼

#includestdio.h

int num[9][9], xy[9][9];

int check(int x, int y) {

    int i, 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))

            return 0;

    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 != xn + i % 3 != y)

            return 0;

    return 1;

}

void search(int x, int y) {

    if (x == 9)

        for(x = 0; x  9; x++) {

            for(y = 0; y  9; y++)

                printf(“%d “, xy[x][y]);

            printf(“\n”);

        }

    else if (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;

}

int main() {

    int i, 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);

    return 0;

}

輸入為9行9列整數,已知的整數填寫對應的數字,尚待計算的未知數字填寫0。

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

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

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

/*

因為你說是數獨 可是你只表述了行列相等,如果是數獨應該對角線相加也相等,所以我寫了兩個判斷函數,judge1為對角線也相等的情況,judge為你描述的行列和相等(情況太多了)

結題方案只需要做一次dfs就可以了,還需要配合一個棧來存儲dfs的路徑,將每個符合條件的路徑做一次行列和是否相等的判斷 然後輸出就是要的結果!

*/

#includestdio.h

#includememory.h

#includestdbool.h

//stack

int a[9]={0};//a[0]–a[0][0] a[1]–a[0][1] and so on  simulate stack

int len=0;

//dfs

int visited[10]={0};

bool judge()//行列相等

{

    int i,j;

    int tmp[6]={0};

    for(i=0;i3;i++)

        for(j=0;j3;j++)

            tmp[i]+=a[3*i+j];

    for(i=0;i3;i++)

        for(j=0;j3;j++)

            tmp[3+i]+=a[i+3*j];

    int jud=tmp[0];

    for(i=1;i6;i++)

    {

        if(jud!=tmp[i])

            return false;

    }

    return true;

}

bool judge1()//行列相等 對角線也相等

{

    int i,j;

    int tmp[8]={0};

    for(i=0;i3;i++)

        for(j=0;j3;j++)

            tmp[i]+=a[3*i+j];

    for(i=0;i3;i++)

        for(j=0;j3;j++)

            tmp[3+i]+=a[i+3*j];

    tmp[7]=a[0]+a[4]+a[8];

    tmp[6]=a[2]+a[4]+a[6];

    int jud=tmp[0];

    for(i=1;i8;i++)

    {

        if(jud!=tmp[i])

            return false;

    }

    return true;

}

void printa()

{

    int t,p;

    for(t=0;t3;t++)

    {

        for(p=0;p3;p++)

        {

            printf(“%d “,a[3*t+p]);

        }

        printf(“\n”);

    }

}

void dfs(int i,int v[])

{

    if(i==10)//find one solution

    {

        if(judge1())//給你寫了兩個判斷函數 如果對角線也相等那麼用judge1()即可判斷

            printa();

        return;

    }

    int j;

    for(j=1;j=9;j++)

    {

        int tmp[10];

        memcpy(tmp,v,10*sizeof(int));

        if(tmp[j]==0)

        {

            tmp[j]=1;

            a[len++]=j;

            //printf(“%d %d\n”,len-1,a[len-1]);

            dfs(i+1,tmp);

            len–;

        }

    }

}

int main(void)

{

    dfs(1,visited);

    return 0;

}

用C語言怎麼解數獨

#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; iSIZE; i++)  

    {  

        if(i%3==0)    

        {  

            for(j=0; jSIZE*2+4; j++)  

                putchar(‘-‘);  

            putchar(‘\n’);  

        }         

          

        for(j=0; jSIZE; 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; iSIZE*2+4; i++)  

        putchar(‘-‘);  

    putchar(‘\n’);  

}  

  

void sub(int i, int j, int bit)  

{  

    int k, m;     

      

    for(k=0; kSIZE; 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; iSIZE; i++)  

        for(j=0; jSIZE; 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; kSIZE; 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; iSIZE; i++)  

        for(j=0; jSIZE; 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;  

}

原創文章,作者:HPYD,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/145590.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
HPYD的頭像HPYD
上一篇 2024-10-27 23:51
下一篇 2024-10-27 23:51

相關推薦

  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • Python程序文件的拓展

    Python是一門功能豐富、易於學習、可讀性高的編程語言。Python程序文件通常以.py為文件拓展名,被廣泛應用於各種領域,包括Web開發、機器學習、科學計算等。為了更好地發揮P…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python購物車程序

    Python購物車程序是一款基於Python編程語言開發的程序,可以實現購物車的相關功能,包括商品的添加、購買、刪除、統計等。 一、添加商品 添加商品是購物車程序的基礎功能之一,用…

    編程 2025-04-29
  • 爬蟲是一種程序

    爬蟲是一種程序,用於自動獲取互聯網上的信息。本文將從如下多個方面對爬蟲的意義、運行方式、應用場景和技術要點等進行詳細的闡述。 一、爬蟲的意義 1、獲取信息:爬蟲可以自動獲取互聯網上…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • Vb運行程序的三種方法

    VB是一種非常實用的編程工具,它可以被用於開發各種不同的應用程序,從簡單的計算器到更複雜的商業軟件。在VB中,有許多不同的方法可以運行程序,包括編譯器、發布程序以及命令行。在本文中…

    編程 2025-04-29
  • Python一元二次方程求解程序

    本文將詳細闡述Python一元二次方程求解程序的相關知識,為讀者提供全面的程序設計思路和操作方法。 一、方程求解 首先,我們需要了解一元二次方程的求解方法。一元二次方程可以寫作: …

    編程 2025-04-29

發表回復

登錄後才能評論