728x90
반응형
#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#include<algorithm>
typedef long long ll;
using namespace std;
char board[20][20];
//8방향
int mx[8] = {-1,-1,-1,0,0,1,1,1};
int my[8] = {-1,0,1,-1,1,-1,0,1};
void solve(int i,int len)
{
int posx,posy;
int flag;
//4가지 방향 우 하 좌하 우하
for(int x = 0; x < len; x++)
{
for(int y = 0; y < len; y++)
{
//좌
if(board[x][y] == '.') continue;
for(int k = 0; k < 8; k++)
{
flag = 0;
posx = x + mx[k];
if(!(posx >= 0 && posx < len)) continue;
posy = y + my[k];
if(!(posy >= 0 && posy < len)) continue;
if(board[posx][posy] == '.') continue;
else{
for(int j = 0; j < 3; j++)
{
posx = posx + mx[k];
if(!(posx >= 0 && posx < len)) break;
posy = posy + my[k];
if(!(posy >= 0 && posy < len)) break;
if(board[posx][posy] == '.') break;
flag++;
}
}
if(flag == 3){
printf("#%d YES\n",i+1);
return;
}
}
}
}
printf("#%d NO\n",i+1);
}
int main(void)
{
int size;
int len;
scanf("%d",&size);
for(int i = 0; i < size; i++)
{
scanf("%d",&len);
for(int x = 0; x < len; x++)
{
scanf("%s",board[x]);
}
//가능성이 없는곳은 제외를 해줘야함
solve(i,len);
}
return 0;
}
풀이방법 :
완전탐색
총 8방향으로 움직일 수 있다.
그걸 mx my에 배열로 담아둔다.
1. 내 위치가 . 이면 continuel
2. 내 위치가 o면 그 위치, 방향을 기준으로 O가 5개인지 체크한다.
중간중간에 빨리 continue, break 해서 불필요한 횟수를 줄인다.
왜 flag가 3인가?
예제에 있는 0,4를 기준으로 보면
1. 0,4 에서 o 가 있음.
2. mx,my를 추가해서 1,3에서 o가 있음
이제 for문으로 들어감
3. 1,3에서 -> 2,2로 바뀜. 이후 flag +1
2. 2,2에서 -> 3,1로 바뀜 flag+1
3. 3,1에서 -> 4,0으로 바뀜 flag +1
시행착오:
1. flag 처음에 4로 오해함.
2. 출력형식 NO를 No로 함..
이만..
--END=
728x90
반응형
'컴퓨터 > 알고리즘' 카테고리의 다른 글
[SWEA] 10965. 제곱수 만들기 (에라토스테네스의 체) 빠른속도 (0) | 2021.02.06 |
---|---|
[SWEA] 11285. 다트 게임 (0) | 2021.02.05 |
[SWEA] 1859. 백만 장자 프로젝트 (0) | 2021.02.03 |
[SWEA] 1954. 달팽이 숫자 (0) | 2021.02.02 |
[SWEA] 1288. 새로운 불면증 치료법(비트마스크) (0) | 2021.02.01 |