스도쿠는 숫자퍼즐로, 가로 9칸 세로 9칸으로 이루어져 있는 표에 1 부터 9 까지의 숫자를 채워넣는 퍼즐이다.
같은 줄에 1 에서 9 까지의 숫자를 한번씩만 넣고, 3 x 3 크기의 작은 격자 또한, 1 에서 9 까지의 숫자가 겹치지 않아야 한다.
입력으로 9 X 9 크기의 스도쿠 퍼즐의 숫자들이 주어졌을 때, 위와 같이 겹치는 숫자가 없을 경우, 1을 정답으로 출력하고 그렇지 않을 경우 0 을 출력한다.
데이터를 모두 저장한 후 가로, 세로의 합을 완전탐색을 통해 모두 구한 후 확인한다.
이후 각 구간별 합을 확인한다.
(i+3,j+3씩 시작지점으로)
#include<iostream>
using namespace std;
int arr[9][9] = { 0, };
int main(int argc, char** argv)
{
int test_case;
int T;
cin >> T;
for (test_case = 1; test_case <= T; ++test_case)
{
// 합이 45이면 OK
int answer = 1;
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
cin >> arr[i][j];
}
}
for (int i = 0; i < 9; i++) {
int sum_row = 0;
int sum_col = 0;
for (int j = 0; j < 9; j++) {
sum_row += arr[i][j];
sum_col += arr[j][i];
}
if (sum_row != 45 || sum_col != 45) answer = 0;
}
for (int i = 0; i < 9; i += 3) {
for (int j = 0; j < 9; j+=3) {
int sum_part = 0;
for (int k = i; k < i + 3; k++) {
for (int l = j; l < j + 3; l++) {
sum_part += arr[k][l];
}
}
if (sum_part != 45) answer = 0;
}
}
cout << "#" << test_case << " " << answer << "\n";
}
return 0;
}