匿名使用者
匿名使用者 發問時間: 電腦與網際網路程式設計 · 5 年前

請問第21~41(檢查在小九宮格內有無重複)行要怎麼寫?

#include <stdio.h>

int table[9][9], zero_x[81], zero_y[81], len, ans;

bool check_x(int x, int y, int value) //檢查橫的有無重複

{

for (int i=0; i<9; i++)

{

if (value == table[x][i]) return 1;

}

return 0;

}

bool check_y(int x, int y, int value) //檢查直的有無重複

{

for (int i=0; i<9; i++)

{

if (value == table[i][y]) return 1;

}

return 0;

}

bool check_square(int x, int y, int value) //檢查小九宮格內有無重複

{

int b=y;

for (int k=0; k<3 ; k++)

{

if(k==0) x=x+0;

if(k==1) x=x+1;

if(k==2) x=x+1;

for (int j=0; j<3 ; j++)

{

if(j==0) y=y+0;

if(j==1) y=y+1;

if(j==2) y=y+1;

if(value == table[x][y]) return 1;

if(y!=0 && y%3==0) y=y-3;

}

if(x!=0 && x%3==0) x=x-3;

y=b;

}

return 0;

}

void DFS(int pos)

{

if (pos == len)

{

ans++;

printf("\n");

for (int i=0; i<9; i++)

{

for (int j=0; j<8; j++)

printf("%d ",table[i][j]);

printf("%d\n",table[i][8]);

}

printf("\n");

return;

}

for (int i=1; i<=9; i++)

{

if ( check_x(zero_x[pos], zero_y[pos], i) ) continue;

if ( check_y(zero_x[pos], zero_y[pos], i) ) continue;

if ( check_square(zero_x[pos], zero_y[pos], i) ) continue;

table[ zero_x[pos] ][ zero_y[pos] ] = i;

DFS( pos + 1 );

table[ zero_x[pos] ][ zero_y[pos] ] = 0;

}

}

int main()

{

freopen("sudo.txt","r",stdin);

freopen("sudoout-wrong2.txt","w",stdout);

len = ans = 0;

for (int i=0; i<9; i++)

for (int j=0; j<9; j++)

{

scanf("%d",&table[i][j]);

if (!table[i][j]) zero_x[len] = i, zero_y[len++] = j;

}

DFS( 0 );

printf("there are %d solution(s).\n",ans);

return 0;

}

3 個解答

評分
  • 5 年前
    最佳解答

    table[9][9]; 做成全域變數.真的是歷史罪人啊!!!

    2015-06-14 23:42:29 補充:

    bool good(

    int*t,

    int s=3 // size of the layer1 square

    ){

    bool ret;

    int S=s*s,r,c,i;

    // row value range

    for(i=S-1,ret=true;ret&&i>=0;--i)ret=t[i]>0&&t[i]<(S-1);

    // row check

    if(false==ret) return ret;

    for(r=S-1,ret=true;ret&&r>=0;--r)

    for(c=S-1;ret&&c>=0;--c)

    for(i=c-1;ret&&i>=0;--i){

    ret=t[r*S+c]!=t[r*S+i];

    }

    // check colume

    if(false==ret)return ret;

    for(c=S-1;ret&&c>=0;--c)

    for(r=S-1;ret&&r>=0;--r)

    for(i=r-1;i>=0;--i){

    ret=t[r*S+c]!=t[i*S+c];

    }

    // check the layer1 square

    if(false==ret)return ret;

    int R,C,I;

    for(R=s-1;ret&&R>=0;--R)

    for(C=s-1;ret&&C>=0;--C)

    for(r=s-1;ret&&r>=0;--r)

    for(c=s-1;ret&&c>=0;--c)

    for(I=r;ret&&I>=0;--I)

    for(i=(I==r)?(c-1):(s-1);ret&&i>=0;--i){

    ret=t[(R*s+r)*S+(C*s+c)]!=t[(R*s+I)*S+(C*s+i)];

    }

    return ret;

    }

    int main(void){

    // example calling sequence

    int t[9][9];

    if(good(t,3)) // 9X9 sutoku should use 3

    int u[4][4];

    if(good(u,2)) // 4x4 sutoku should use 2

    }

    2015-06-14 23:46:53 補充:

    // cell value range check

    for(i=S*S-1,ret=true;ret&&i>=0;--i)ret=t[i]>0&&t[i]<(S-1);

    // sorry for the typos

  • 阿平
    Lv 4
    5 年前

    尤怪之家

    http://oddest.nc.hcc.edu.tw/

    數獨樂園>相關論述>C 語言數獨解題程式原始碼

  • XiDeww
    Lv 4
    5 年前

    只給程式碼,問題重點都沒說...

還有問題?馬上發問,尋求解答。