#include<stdio.h> #define BUFLEN 80 int map[4][4]; int gyo[4][4];/*gyo[m]=0:i+1行に数字m+1が出現していない*/ int retu[4][4];/*retu[m]=0:i+1行に数字m+1が出現していない*/ int block[4][4];/*block[m]=0:i+1ブロックに数字mが出現していない*/ int count=0; int numpre(){ int i,j,k,m; /*配列の初期化*/ for(i=0;i<4;i++) for(j=0;j<4;j++){ block[j]=0; retu[j]=0; gyo[j]=0;} for(i=0;i<4;i++) for(j=0;j<4;j++){ m = map[j]; if(m>0){ gyo[m-1]=1;retu[j][m-1]=1; k=(i/2)*2+j/2+1; block[k-1][m-1]=1; } } /*ここから先に可能性をしぼりこむコードをかく*/ } int main(void){ char buf[BUFLEN]; int i,j; for(i=0;i<4;i++){ fgets(buf,BUFLEN,stdin); sscanf(buf,"%d %d %d %d", &map[0],&map[1], &map[i][2],&map[i][3]); } if(numpre()==1) printf("解けた"); else printf("解けない"); }
4×4の数独の問題を入力し、それが解けるか否かを出力するプログラムを作成しています。
http://puzzle.lavot.com/java/numberplace/algorithm.html
こちらのアルゴリズムを参考に、行,列,2×2のブロックに1~4の数字が出現しているときに配列gyo,retu,blockに格納するところまで作ったのですが、URLのステップ1,"ある数字が入る可能性のあるマスが1ヶ所しか残っていない場合"の判定をどうするかで詰まりました。
助言をお願いします。
なお、大学の課題なのでmain関数は改変不可です。