#include <iostream> using namespace std; | |
int N, X; | |
int margin; | |
int map[20][20]; | |
void input(); | |
bool vertical(int x); | |
bool horizontal(int y); | |
bool Can(int x, int i, int mode); | |
int main(){ | |
int tc; | |
scanf("%d",&tc); | |
for(int T=1; T<=tc; T++){ | |
int ans=0; | |
input(); | |
for(int i=0; i<N; i++){ | |
margin=-1; | |
ans+=vertical(i); | |
} | |
for(int i=0; i<N; i++){ | |
margin=-1; | |
ans+=horizontal(i); | |
} | |
printf("#%d %d\n",T, ans); | |
} | |
return 0; | |
} | |
void input(){ | |
scanf("%d %d",&N, &X); | |
for(int i=0; i<N; i++){ | |
for(int j=0; j<N; j++){ | |
scanf("%d", map[i]+j); | |
} | |
} | |
return; | |
} | |
bool vertical(int x){ | |
int tmp=map[0][x]; | |
for(int i=1; i<N; i++){ | |
if(map[i][x]!=tmp){ | |
if(tmp==map[i][x]-1){ | |
if(!Can(x, i, 0)) { | |
return false; | |
} | |
else{ | |
tmp=map[i][x]; | |
} | |
} | |
else if(tmp==map[i][x]+1){ | |
if(!Can(x, i, 1)) { | |
return false; | |
} | |
else{ | |
i+=X-1; | |
tmp=map[i][x]; | |
} | |
} | |
else return false; | |
} | |
} | |
return true; | |
} | |
bool horizontal(int y){ | |
int tmp=map[y][0]; | |
for(int i=1; i<N; i++){ | |
if(map[y][i]!=tmp){ | |
if(tmp==map[y][i]-1){ | |
if(!Can(y, i, 2)) return false; | |
else{ | |
tmp=map[y][i]; | |
} | |
} | |
else if(tmp==map[y][i]+1){ | |
if(!Can(y, i, 3)) { | |
return false; | |
} | |
else{ | |
i+=X-1; | |
tmp=map[y][i]; | |
} | |
} | |
else return false; | |
} | |
} | |
return true; | |
} | |
bool Can(int x, int i, int mode){ | |
int tmp; | |
if((mode==0||mode==2) && i-X<=margin) return false; | |
if((mode==1||mode==3) && i-1+X>=N) return false; | |
if(mode==0){ | |
tmp=map[i][x]-1; | |
for(int j=i-X; j<i; j++){ | |
if(map[j][x]!=tmp) return false; | |
} | |
margin=i-1; | |
return true; | |
} | |
else if(mode==1) { | |
tmp=map[i][x]; | |
for(int j=i; j<i+X; j++){ | |
if(map[j][x]!=tmp) return false; | |
} | |
margin=i+X-1; | |
return true; | |
} | |
else if(mode==2){ | |
tmp=map[x][i]-1; | |
for(int j=i-X; j<i; j++){ | |
if(map[x][j]!=tmp) return false; | |
} | |
margin=i-1; | |
return true; | |
} | |
else if(mode==3){ | |
tmp=map[x][i]; | |
for(int j=i; j<i+X; j++){ | |
if(map[x][j]!=tmp) return false; | |
} | |
margin=i+X-1; | |
return true; | |
} | |
} |
'알고리즘 문제 풀이 > 코딩 테스트 대비(~211220)' 카테고리의 다른 글
백준 1712 손익분기점 (0) | 2021.04.15 |
---|---|
180413_점심식사시간 (0) | 2018.04.13 |
디저트 카페 (0) | 2018.04.09 |
특이한 자석 (0) | 2018.03.28 |
숫자 만들기 (0) | 2018.03.26 |
#include <iostream> using namespace std; | |
int N, X; | |
int margin; | |
int map[20][20]; | |
void input(); | |
bool vertical(int x); | |
bool horizontal(int y); | |
bool Can(int x, int i, int mode); | |
int main(){ | |
int tc; | |
scanf("%d",&tc); | |
for(int T=1; T<=tc; T++){ | |
int ans=0; | |
input(); | |
for(int i=0; i<N; i++){ | |
margin=-1; | |
ans+=vertical(i); | |
} | |
for(int i=0; i<N; i++){ | |
margin=-1; | |
ans+=horizontal(i); | |
} | |
printf("#%d %d\n",T, ans); | |
} | |
return 0; | |
} | |
void input(){ | |
scanf("%d %d",&N, &X); | |
for(int i=0; i<N; i++){ | |
for(int j=0; j<N; j++){ | |
scanf("%d", map[i]+j); | |
} | |
} | |
return; | |
} | |
bool vertical(int x){ | |
int tmp=map[0][x]; | |
for(int i=1; i<N; i++){ | |
if(map[i][x]!=tmp){ | |
if(tmp==map[i][x]-1){ | |
if(!Can(x, i, 0)) { | |
return false; | |
} | |
else{ | |
tmp=map[i][x]; | |
} | |
} | |
else if(tmp==map[i][x]+1){ | |
if(!Can(x, i, 1)) { | |
return false; | |
} | |
else{ | |
i+=X-1; | |
tmp=map[i][x]; | |
} | |
} | |
else return false; | |
} | |
} | |
return true; | |
} | |
bool horizontal(int y){ | |
int tmp=map[y][0]; | |
for(int i=1; i<N; i++){ | |
if(map[y][i]!=tmp){ | |
if(tmp==map[y][i]-1){ | |
if(!Can(y, i, 2)) return false; | |
else{ | |
tmp=map[y][i]; | |
} | |
} | |
else if(tmp==map[y][i]+1){ | |
if(!Can(y, i, 3)) { | |
return false; | |
} | |
else{ | |
i+=X-1; | |
tmp=map[y][i]; | |
} | |
} | |
else return false; | |
} | |
} | |
return true; | |
} | |
bool Can(int x, int i, int mode){ | |
int tmp; | |
if((mode==0||mode==2) && i-X<=margin) return false; | |
if((mode==1||mode==3) && i-1+X>=N) return false; | |
if(mode==0){ | |
tmp=map[i][x]-1; | |
for(int j=i-X; j<i; j++){ | |
if(map[j][x]!=tmp) return false; | |
} | |
margin=i-1; | |
return true; | |
} | |
else if(mode==1) { | |
tmp=map[i][x]; | |
for(int j=i; j<i+X; j++){ | |
if(map[j][x]!=tmp) return false; | |
} | |
margin=i+X-1; | |
return true; | |
} | |
else if(mode==2){ | |
tmp=map[x][i]-1; | |
for(int j=i-X; j<i; j++){ | |
if(map[x][j]!=tmp) return false; | |
} | |
margin=i-1; | |
return true; | |
} | |
else if(mode==3){ | |
tmp=map[x][i]; | |
for(int j=i; j<i+X; j++){ | |
if(map[x][j]!=tmp) return false; | |
} | |
margin=i+X-1; | |
return true; | |
} | |
} |
'알고리즘 문제 풀이 > 코딩 테스트 대비(~211220)' 카테고리의 다른 글
백준 1712 손익분기점 (0) | 2021.04.15 |
---|---|
180413_점심식사시간 (0) | 2018.04.13 |
디저트 카페 (0) | 2018.04.09 |
특이한 자석 (0) | 2018.03.28 |
숫자 만들기 (0) | 2018.03.26 |