answldnd08   3년 전

예제와 다른 스도쿠문제들을 넣어서 돌려보아도 답이 나오는 것 같은데 왜 제출이 안되는걸까요?..

문제점을 발견해주신다면 감사하겠습니다.

answldnd08   3년 전

문제를 천천히 읽어보니 0이 모두 입력되었을때와같이 여러개의 답이 나오는경우에 하나만 출력해야하는 것을 알게되었습니다

밑과같이 수정하니 풀렸습니다.

#include
int sdoq[9][9];
int x[81] = { 0 };
int y[81] = { 0 };
int check(int num);
int count = 0;
void sdoqu(int num);
int n = 0;
int main(void) {

for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
scanf("%d", &sdoq[i][j]);
}
}

for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (sdoq[i][j] == 0) {
x[count] = i;
y[count] = j;
count++;
}
}
}
sdoqu(0);
return 0;
}

void sdoqu(int num) {

if (n == 1)
return;
if (num == count) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
printf("%d", sdoq[i][j]);
}
printf("\n");
}
n = 1;
return;
}
for (int i = 1; i <= 9; i++) {
sdoq[x[num]][y[num]] = i;
if (check(num) == 0) {
sdoqu(num + 1);
}
sdoq[x[num]][y[num]] = 0;

}

}

int check(int num) {
/*가로줄에서 같은 숫자가 있으면 안된다.*/
for (int i = 0; i < 9; i++) {
if (y[num] == i)
continue;
else if (sdoq[x[num]][y[num]] == sdoq[x[num]][i])
return 1;
}

for (int i = 0; i < 9; i++) {
if (x[num] == i)
continue;
else if (sdoq[x[num]][y[num]] == sdoq[i][y[num]])
return 1;
}

for (int i = (x[num] / 3)*3; i < 3 + 3*(x[num] / 3); i++) {
for (int j = (y[num] / 3)*3; j < 3 + 3*(y[num] / 3); j++) {
if (x[num] == i && y[num] == j)
continue;
if (sdoq[i][j] == sdoq[x[num]][y[num]])
return 1;
}
}
return 0;
}

댓글을 작성하려면 로그인해야 합니다.