#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関数は改変不可です。