- toc {:toc}
๋ฌธ์
NรNํฌ๊ธฐ์ ํ๋ ฌ๋ก ํํ๋๋ ์ข ์ด๊ฐ ์๋ค. ์ข ์ด์ ๊ฐ ์นธ์๋ -1, 0, 1 ์ค ํ๋๊ฐ ์ ์ฅ๋์ด ์๋ค. ์ฐ๋ฆฌ๋ ์ด ํ๋ ฌ์ ๋ค์๊ณผ ๊ฐ์ ๊ท์น์ ๋ฐ๋ผ ์ ์ ํ ํฌ๊ธฐ๋ก ์๋ฅด๋ ค๊ณ ํ๋ค.
- ๋ง์ฝ ์ข ์ด๊ฐ ๋ชจ๋ ๊ฐ์ ์๋ก ๋์ด ์๋ค๋ฉด ์ด ์ข ์ด๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค.
- (1)์ด ์๋ ๊ฒฝ์ฐ์๋ ์ข ์ด๋ฅผ ๊ฐ์ ํฌ๊ธฐ์ ์ข ์ด 9๊ฐ๋ก ์๋ฅด๊ณ , ๊ฐ๊ฐ์ ์๋ฆฐ ์ข ์ด์ ๋ํด์ (1)์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
์ด์ ๊ฐ์ด ์ข ์ด๋ฅผ ์๋์ ๋, -1๋ก๋ง ์ฑ์์ง ์ข ์ด์ ๊ฐ์, 0์ผ๋ก๋ง ์ฑ์์ง ์ข ์ด์ ๊ฐ์, 1๋ก๋ง ์ฑ์์ง ์ข ์ด์ ๊ฐ์๋ฅผ ๊ตฌํด๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N(1 โค N โค 37, N์ 3k ๊ผด)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์๋ N๊ฐ์ ์ ์๋ก ํ๋ ฌ์ด ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ -1๋ก๋ง ์ฑ์์ง ์ข ์ด์ ๊ฐ์๋ฅผ, ๋์งธ ์ค์ 0์ผ๋ก๋ง ์ฑ์์ง ์ข ์ด์ ๊ฐ์๋ฅผ, ์ ์งธ ์ค์ 1๋ก๋ง ์ฑ์์ง ์ข ์ด์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
์ถ์ฒ: https://www.acmicpc.net/problem/1780
ํ์ด
- n = 1์ผ ๋์๋ ๊ทธ ๊ฐ์ด ์ข ์ด ํ ์ฅ์ด๊ธฐ ๋๋ฌธ์ ans์ ๊ฐ์๋ฅผ ์ถ๊ฐํด์ค๋ค.
- n = k์ผ ๋ ์ ์ฒด๊ฐ ๊ฐ์ ๊ฐ์ธ์ง ํ์ธํ๋ค.
- ๊ฐ์ ๊ฐ์ด๋ฉด ๊ทธ๋๋ก ๊ทธ ๊ฐ์ ๋ํ ans์ ๊ฐ์ ์ถ๊ฐํด์ค๋ค.
- ๋ค๋ฅด๋ค๋ฉด ์ฌ๊ทํจ์๋ฅผ ํตํด 9์ฅ์ผ๋ก ๋๋๋ค.
- ์ด ๋ ์ธ๋ฑ์ค์ ์ฃผ์ํ๋ค.
#include <bits/stdc++.h>
using namespace std;
int ans[5];
int board[2200][2200];
void func(const int board[2200][2200], int n, int x, int y){
int is_same = 1;
int num = board[x][y];
if(n==1) {
ans[num+1]++;
return;
}
for(int i = x; i < x+n; i++){ // ์ธ๋ฑ์ค๋ฅผ ๊ทธ๋ฅ n์ผ๋ก ๋๋ฉด n=3์ด๊ณ
for(int j = y; j < y+n; j++){ // x๋ y๊ฐ 3๋ณด๋ค ํฌ๋ฉด ๋ฐ๋ณต๋ฌธ์ ๊ทธ๋ฅ ์ง๋์น๋ค.
if(num == board[i][j]) continue;
is_same = 0;
break;
}
if(is_same == 0) break;
}
if(is_same == 1){
ans[num+1]++;
return;
}
for(int i = x; i < x+n; i += n/3){
for(int j = y; j < y+n; j += n/3){
func(board, n/3, i, j);
}
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
cin >> board[i][j];
}
}
func(board, n, 0, 0);
cout << ans[0] << endl;
cout << ans[1] << endl;
cout << ans[2] << endl;
}