快刀亂麻 10 發表於 May 30, 2008 檢舉 Share 發表於 May 30, 2008 我找到了原始碼 跑出來是1*9的 可是有瑕疵 就是把數字改掉就會有重複的可能(假如我把第4個數字改成3 那跑出來就會有兩個3了) 請會的人幫忙改一下 或提供自己的寫法也可以 如果有跑出來是9*9的更佳謝謝對了 補充問題一下 數獨就是每一行每一列的數字都是1~9(所以每一列或每一行加起來會等於45) 而且不能重複#include <stdio.h>#include <stdlib.h>int main(){ int sdk[9]={0,0,4,0,0,8,0,2,5}; int j,k,n; for(j=0,k=1;j<9;j++) if(sdk[j]==0){ //找0 for(n=0;n<9;n++) if(sdk[n]==k) { k++; } sdk[j] = k; } for(j=0;j<9;j++) printf("%d ",sdk[j]); system("pause");} 鏈接文章 分享到其他網站
TerryW 10 發表於 May 30, 2008 檢舉 Share 發表於 May 30, 2008 這跟人腦玩數獨是差不多的你可以先統計每個空格可能的數字是哪些然後找出只有一個可能數字的空格,將其數字填入後從同行同列同九宮格的空格的可能數字中刪除該數字如此不斷進行下去若找不到只有一個可能數字的空格,就先猜個數字填入看看結果,然後進行上述步驟,若不行就從頭來過 鏈接文章 分享到其他網站
電腦狂 10 發表於 June 12, 2008 檢舉 Share 發表於 June 12, 2008 數獨喔...其實用AI開發的Programming Language會寫得很開心...因為code超短@@ex : prolog 鏈接文章 分享到其他網站
PsTEm 10 發表於 June 12, 2008 檢舉 Share 發表於 June 12, 2008 對了 補充問題一下 數獨就是每一行每一列的數字都是1~9(所以每一列或每一行加起來會等於45) 而且不能重複恩..這個演算法好像有問題如果整盤的數字都是5好像也會通過我看過的作法是宣告陣列紀錄哪些數字出現過然後一行一行觀察 鏈接文章 分享到其他網站
電腦狂 10 發表於 June 15, 2008 檢舉 Share 發表於 June 15, 2008 恩..這個演算法好像有問題如果整盤的數字都是5好像也會通過我看過的作法是宣告陣列紀錄哪些數字出現過然後一行一行觀察他的意思是每一行每一列都必須是1~9不能重複這演算法基本上沒問題和你的作法概念上是相同的話說數獨簡易版(好像是5*5,有點忘了)是96年(還是95忘了= =")奧林匹亞初選題目唷 鏈接文章 分享到其他網站
PsTEm 10 發表於 June 15, 2008 檢舉 Share 發表於 June 15, 2008 1樓的程式修好了#include <stdio.h>#include <stdlib.h>int main(){int sdk[9]={0,0,9,0,0,8,0,2,5};int j,k,n;for(j=0,k=1;j<9;j++) if(sdk[j]==0){ //找0 for(n=0;n<9;n++) if(sdk[n]==k){ k++; n=0;//重新偵測碰撞 } sdk[j] = k; } for(j=0;j<9;j++) printf("%d ",sdk[j]); system("pause");}他是用偵測目前想填的k值是否會發生碰撞如果進入二維的話這種方法好像會出問題(這個方法應該市直接填答案,錯了在嚓掉)然後我說的問題是(所以每一列或每一行加起來會等於45)不過我想到的方法是9*9的棋盤9*9*9的'可能性棋盤'//記載可能答案整個程式是讀取棋盤填寫'可能性棋盤'L1:搜尋只有一個可能數字的點填入數字修改該行 該列 該方塊 的可能性棋盤如果棋盤還沒填完且無任何只有一個可能數字的點--->雙答案如果棋盤填完 跳出迴圈且輸出棋盤GOTO L1只是...整個程式感覺好麻煩="=(其實我只是把我解數獨的方法打上來而已) 鏈接文章 分享到其他網站
foxs91092 10 發表於 August 6, 2008 檢舉 Share 發表於 August 6, 2008 他的意思是每一行每一列都必須是1~9不能重複這演算法基本上沒問題和你的作法概念上是相同的話說數獨簡易版(好像是5*5,有點忘了)是96年(還是95忘了= =")奧林匹亞初選題目唷95奧賽初選 3富翁種花 9*9,沒有簡化吧...個人解過一題ACM的數獨989 Su Dokuhttp://luckycat.kshs.kh.edu.tw/homework/q989.htm程式碼提供參考 (Backtracing):$#include <cstdlib>#include <cstdio>#define MAX 9using namespace std;bool cols[MAX][MAX];bool rows[MAX][MAX];//informationbool blocks[MAX][MAX];//blocks informationint now_map[MAX][MAX];//map informationstruct blank{ int b_row; int b_col; };blank blanks[MAX*MAX];//blank structureint sudoku(int);int block_j(int, int, int);int N;//len of blockint remaining;bool solved;bool no_solve;int main(int argc, char *argv[]){ bool P=false; while(scanf("%d", &N)!=EOF) { if(P) putchar('\n'); P=true; if(N!=1) { remaining=0; solved=false; no_solve=false; for(int i=0; i<N*N; i++) for(int j=0; j<N*N; j++) cols[i][j]=false; for(int i=0; i<N*N; i++) for(int j=0; j<N*N; j++) rows[i][j]=false; for(int i=0; i<N*N; i++) for(int j=0; j<N*N; j++) blocks[i][j]=false; //initialization for(int i=0; i<N*N; i++) for(int j=0; j<N*N; j++) { scanf("%d", &now_map[i][j]); if(now_map[i][j]==0) { blanks[remaining].b_row=i; blanks[remaining].b_col=j; remaining++; } else if(!no_solve) { int B=block_j(i, j, N); if(!rows[i][now_map[i][j]-1]&&!cols[j][now_map[i][j]-1]&&!blocks[B][now_map[i][j]-1]) { rows[i][now_map[i][j]-1]=true; cols[j][now_map[i][j]-1]=true; blocks[B][now_map[i][j]-1]=true; } else { no_solve=true; } } } //load map if(!no_solve) sudoku(remaining); //backtracing if(!solved||no_solve) printf("NO SOLUTION\n"); } else { int temp; scanf("%d", &temp); printf("1\n"); } } //process return 0;}int sudoku(int remain){ if(solved) { return 0;} if(remain==0) { for(int i=0; i<N*N; i++) { printf("%d", now_map[i][0]); for(int j=1; j<N*N; j++) printf(" %d", now_map[i][j]); putchar('\n');} solved=true; return 0; } //solved for(int k=0; k<N*N&&!solved; k++) { int B=block_j(blanks[remaining-remain].b_row, blanks[remaining-remain].b_col, N); if(!rows[blanks[remaining-remain].b_row][k]&&!cols[blanks[remaining-remain].b_col][k]&&!blocks[B][k]) { rows[blanks[remaining-remain].b_row][k]=true; cols[blanks[remaining-remain].b_col][k]=true; blocks[B][k]=true; now_map[blanks[remaining-remain].b_row][blanks[remaining-remain].b_col]=k+1; sudoku(remain-1); rows[blanks[remaining-remain].b_row][k]=false; cols[blanks[remaining-remain].b_col][k]=false; blocks[B][k]=false; now_map[blanks[remaining-remain].b_row][blanks[remaining-remain].b_col]=0; } } //backtracing}int block_j(int row, int col, int len){ int block; block=((row/len)*len)+col/len; return block;} 鏈接文章 分享到其他網站
Recommended Posts
請登入後來留意見
在登入之後,您才能留意見
立即登入