해결 전략)
2차원 맵정보가 있는데 각 좌표마다 방문하면서 4방향(상,하,좌,우)에 인접해있는 모든 개수정보를 알고 결국, 인접해있는개수가 3개이상이면 카운팅을 해줘서 답을 구할수있다.
예를 들어서 그린 그림입니다.
여기서 인접해 있는 것이 보인다면 그 곳으로 좌표이동하고 다시 4방향으로 인접해 있는 개수정보를 파악한다.
이 작업을 모든 맵 좌표를 방문하면서 체크하게 된다. 단, 방문이 된 곳은 체크를 따로해줘서 재탐색이 이뤄지지 않도록 한다.
소스코드)
#include
int map[8][8];
int visit[8][8];
int ret;
int cnt_ret;
int dx[] = { 1,-1,0,0 };
int dy[] = { 0,0,-1,1 };
int solve(int r, int l)
{
// 4방향에서 현재숫자와 같은것을 비교하여 캔디팡이 터지는 영역을 카운팅 하는함수
int tx, ty;
int cnt =1 ;
visit[r][l] = 1;
for (int i = 0; i < 4; i++)
{
tx = r + dx[i];
ty = l + dy[i];
if (tx < 1 || tx > 7 || ty < 1 || ty >7)
{
continue;
}
else
{
if (!visit[tx][ty] && (map[tx][ty] == map[r][l]))
{
cnt += solve(tx, ty);
}
}
}
return cnt;
}
int main()
{
for (int i = 1; i <= 7; i++)
{
for (int j = 1; j <= 7; j++)
{
scanf("%d", &map[i][j]);
}
}
for (int i = 1; i <= 7; i++)
{
for (int j = 1; j <= 7; j++)
{
ret = solve(i,j);
if (ret >= 3)
{
cnt_ret++;
}
}
}
printf("%d\n", cnt_ret);
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | #include<stdio.h> int map[8][8]; int visit[8][8]; int ret; int cnt_ret; int dx[] = { 1,-1,0,0 }; int dy[] = { 0,0,-1,1 }; int solve(int r, int l) { // 4방향에서 현재숫자와 같은것을 비교하여 캔디팡이 터지는 영역을 카운팅 하는함수 int tx, ty; int cnt =1 ; visit[r][l] = 1; for (int i = 0; i < 4; i++) { tx = r + dx[i]; ty = l + dy[i]; if (tx < 1 || tx > 7 || ty < 1 || ty >7) { continue; } else { if (!visit[tx][ty] && (map[tx][ty] == map[r][l])) { cnt += solve(tx, ty); } } } return cnt; } int main() { for (int i = 1; i <= 7; i++) { for (int j = 1; j <= 7; j++) { scanf("%d", &map[i][j]); } } for (int i = 1; i <= 7; i++) { for (int j = 1; j <= 7; j++) { ret = solve(i,j); if (ret >= 3) { cnt_ret++; } } } printf("%d\n", cnt_ret); } | cs |