#include <cstdio> using namespace std; | |
int map_melting[302][302]; | |
int map_origin[302][302]; | |
bool visit[302][302]; | |
int dx[4]={1,-1,0,0}; | |
int dy[4]={0,0,1,-1}; | |
void dfs(int y, int x) | |
{ | |
visit[y][x]=1; | |
for(int i=0; i<4; i++) | |
{ | |
int ny=y+dy[i]; | |
int nx=x+dx[i]; | |
if(map_origin[ny][nx] != 0 && !visit[ny][nx]) | |
dfs(ny, nx); | |
} | |
} | |
int main() | |
{ | |
int N, M; | |
scanf("%d %d",&N,&M); | |
/*input*/ | |
for(int i=1; i<=N; i++) | |
for(int j=1; j<=M; j++) | |
{scanf("%d",&map_origin[i][j]);} | |
int land=0; | |
int year=0; | |
while(1) | |
{ | |
for(int i=2; i<N; i++) | |
for(int j=2; j<M; j++) | |
visit[i][j]=0; | |
land=0; | |
bool chk=0; | |
for(int i=2; i<N; i++) | |
for(int j=2; j<M; j++) | |
{ | |
if(map_origin[i][j] != 0 && !visit[i][j]) | |
{ | |
if(land==1) | |
{printf("%d",year); return 0;} | |
dfs(i,j); land++; | |
} | |
if(map_origin[i][j]>0 && !chk) chk=1; | |
} | |
if(!chk) {printf("0"); return 0;} | |
/*melting_iceburg*/ | |
for(int i=1; i<N; i++) | |
{ | |
for(int j=1; j<M; j++) | |
{ | |
if(!map_origin[i][j]) continue; | |
int cnt=0; | |
if(!map_origin[i][j-1]) cnt++; | |
if(!map_origin[i][j+1]) cnt++; | |
if(!map_origin[i-1][j]) cnt++; | |
if(!map_origin[i+1][j])cnt++; | |
map_melting[i][j]= map_origin[i][j]-cnt; | |
if(map_melting[i][j]<0) map_melting[i][j]=0; | |
} | |
} /*melting_iceburg*/ | |
for(int i=1; i<=N; i++) | |
for(int j=1; j<=M; j++) | |
{ map_origin[i][j]=map_melting[i][j];} | |
year++; | |
} | |
} |
마지막에 조건 하나를 놓쳐서 계속 실패
만일 전부 다 녹을 때까지 두 덩어리 이상으로 분리되지 않으면 프로그램은 0을 출력한다.
'알고리즘 문제 풀이 > 1DP_과제(~180615)' 카테고리의 다른 글
171125_1157_단어 공부 (0) | 2017.11.25 |
---|---|
171124_1952_수영장 (0) | 2017.11.24 |
171123_1222_계산기1 (0) | 2017.11.23 |
171122_11654_아스키코드 (0) | 2017.11.22 |
171122_1152_문자의 개수 (0) | 2017.11.22 |
#include <cstdio> using namespace std; | |
int map_melting[302][302]; | |
int map_origin[302][302]; | |
bool visit[302][302]; | |
int dx[4]={1,-1,0,0}; | |
int dy[4]={0,0,1,-1}; | |
void dfs(int y, int x) | |
{ | |
visit[y][x]=1; | |
for(int i=0; i<4; i++) | |
{ | |
int ny=y+dy[i]; | |
int nx=x+dx[i]; | |
if(map_origin[ny][nx] != 0 && !visit[ny][nx]) | |
dfs(ny, nx); | |
} | |
} | |
int main() | |
{ | |
int N, M; | |
scanf("%d %d",&N,&M); | |
/*input*/ | |
for(int i=1; i<=N; i++) | |
for(int j=1; j<=M; j++) | |
{scanf("%d",&map_origin[i][j]);} | |
int land=0; | |
int year=0; | |
while(1) | |
{ | |
for(int i=2; i<N; i++) | |
for(int j=2; j<M; j++) | |
visit[i][j]=0; | |
land=0; | |
bool chk=0; | |
for(int i=2; i<N; i++) | |
for(int j=2; j<M; j++) | |
{ | |
if(map_origin[i][j] != 0 && !visit[i][j]) | |
{ | |
if(land==1) | |
{printf("%d",year); return 0;} | |
dfs(i,j); land++; | |
} | |
if(map_origin[i][j]>0 && !chk) chk=1; | |
} | |
if(!chk) {printf("0"); return 0;} | |
/*melting_iceburg*/ | |
for(int i=1; i<N; i++) | |
{ | |
for(int j=1; j<M; j++) | |
{ | |
if(!map_origin[i][j]) continue; | |
int cnt=0; | |
if(!map_origin[i][j-1]) cnt++; | |
if(!map_origin[i][j+1]) cnt++; | |
if(!map_origin[i-1][j]) cnt++; | |
if(!map_origin[i+1][j])cnt++; | |
map_melting[i][j]= map_origin[i][j]-cnt; | |
if(map_melting[i][j]<0) map_melting[i][j]=0; | |
} | |
} /*melting_iceburg*/ | |
for(int i=1; i<=N; i++) | |
for(int j=1; j<=M; j++) | |
{ map_origin[i][j]=map_melting[i][j];} | |
year++; | |
} | |
} |
마지막에 조건 하나를 놓쳐서 계속 실패
만일 전부 다 녹을 때까지 두 덩어리 이상으로 분리되지 않으면 프로그램은 0을 출력한다.
'알고리즘 문제 풀이 > 1DP_과제(~180615)' 카테고리의 다른 글
171125_1157_단어 공부 (0) | 2017.11.25 |
---|---|
171124_1952_수영장 (0) | 2017.11.24 |
171123_1222_계산기1 (0) | 2017.11.23 |
171122_11654_아스키코드 (0) | 2017.11.22 |
171122_1152_문자의 개수 (0) | 2017.11.22 |