#include <stdio.h>
#include <stdlib.h>
#define OFF 0
#define ON 1
#define OK 0
#define NG -1
#define N0 0
#define N3 3
#define N9 9
#define N20 20
#define NN 100
typedef struct {
int x;
int y;
} XY;
typedef struct {
int f1[N9];
int kakutei;
XY xy[N20];
} BAN;
BAN a1[N9][N9];
void disp(void)
{
int x , y;
int i;
printf("----------\n");
for(y = N0 ; y < N9 ; y++) {
for(x = N0 ; x < N9 ; x++) {
for(i = N0 ; i < N9 ; i++) {
if(a1[y][x].f1[i] == ON) printf("%d" , i + 1);
}
if(x < 8) printf("-");
}
printf("\n");
}
}
int init(char *filename)
{
FILE *fpi;
char buf[NN];
int x , y;
int x1 , y1;
int x2 , y2;
int i;
int n;
for(y = N0 ; y < N9 ; y++) {
for(x = N0 ; x < N9 ; x++) {
for(i = N0 ; i < N9 ; i++) a1[y][x].f1[i] = ON;
a1[y][x].kakutei = -1;
n = N0;
for(y2 = N0 ; y2 < N9 ; y2++) {
if(y != y2) {
a1[y][x].xy[n].x = x;
a1[y][x].xy[n++].y = y2;
}
}
for(x2 = N0 ; x2 < N9 ; x2++) {
if(x != x2) {
a1[y][x].xy[n].x = x2;
a1[y][x].xy[n++].y = y;
}
}
x1 = (x / N3) * N3;
y1 = (y / N3) * N3;
for(y2 = N0 ; y2 < N3 ; y2++) {
for(x2 = N0 ; x2 < N3 ; x2++) {
if( x1 + x2 != x && y1 + y2 != y) {
a1[y][x].xy[n].x = x1 + x2;
a1[y][x].xy[n++].y = y1 + y2;
}
}
}
}
}
fpi = fopen(filename , "r");
if(fpi == NULL) {
fprintf(stderr , "Can't open %s\n" , filename);
return(NG);
}
for(y = N0 ; y < N9 ; y++) {
fgets(buf , NN , fpi);
for(x = N0 ; x < N9 ; x++) {
if(buf[x] != ' ') {
n = buf[x] - '1';
for(i = N0 ; i < N20 ; i++) a1[a1[y][x].xy[i].y][a1[y][x].xy[i].x].f1[n] = OFF;
for(i = N0 ; i < N9 ; i++) {
if(i != n) a1[y][x].f1[i] = OFF;
}
}
}
}
fclose(fpi);
return(OK);
}
int shokyo(void)
{
int x , y;
int i;
int n;
int cnt = N0;
int ib;
for(y = N0 ; y < N9 ; y++) {
for(x = N0 ; x < N9 ; x++) {
if(a1[y][x].kakutei != -1) continue;
n = N0;
for(i = N0 ; i < N9 ; i++) {
if(a1[y][x].f1[i] == ON) {
ib = i;
n++;
if(n > 1) break;
}
}
if(n == 1) {
for(i = N0 ; i < N20 ; i++) {
a1[a1[y][x].xy[i].y][a1[y][x].xy[i].x].f1[ib] = OFF;
}
a1[y][x].kakutei = ib;
cnt++;
}
}
}
return(cnt);
}
void soatari(int x , int y)
{
int i , j;
int x2 , y2;
int tf1[9];
int tf2[20];
if(y == N9) {
disp();
return;
}
x2 = x + 1;
y2 = y;
if(x2 == N9) {
x2 = N0;
y2++;
}
if(a1[y][x].kakutei != -1) {
soatari(x2 , y2);
return;
}
for(i = N0 ; i < N9 ; i++) {
if(a1[y][x].f1[i] == OFF) continue;
for(j = N0 ; j < N9 ; j++) {
tf1[j] = a1[y][x].f1[j];
if(i != j) a1[y][x].f1[j] = OFF;
}
for(j = N0 ; j < N20 ; j++) {
tf2[j] = a1[a1[y][x].xy[j].y][a1[y][x].xy[j].x].f1[i];
a1[a1[y][x].xy[j].y][a1[y][x].xy[j].x].f1[i] = OFF;
}
soatari(x2 , y2);
for(j = N0 ; j < N20 ; j++) {
a1[a1[y][x].xy[j].y][a1[y][x].xy[j].x].f1[i] = tf2[j];
}
for(j = N0 ; j < N9 ; j++) {
a1[y][x].f1[j] = tf1[j];
}
}
}
int main(int argc , char **argv)
{
int cnt;
if(argc != 2) {
fprintf(stderr , "Usage : %s filename\n" , argv[0]);
return(EXIT_FAILURE);
}
if(init(argv[1]) == NG) {
return(EXIT_FAILURE);
}
cnt = shokyo();
while(cnt > 0) cnt = shokyo();
disp();
soatari(0 , 0);
return(EXIT_SUCCESS);
}
|