Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- AVL 시간 복잡도
- 1764
- Stack 이란
- 백준 1406
- C/C++ 구현
- 풀이
- 5397
- 버킷 정렬
- 해시 구현
- 백준 1158
- c#
- 백준 17822
- heap
- ㅣ풀이
- 게리멘더링2
- 백준 5397
- 자료구조
- 시간 복잡도
- 원판 돌리기
- 조세퍼스 순열
- 백준
- 백준 17779
- 해시구현
- 구현
- 백준 2447
- qorwns
- 백준 17471
- dfs
- 별 찍기 10
- 스택의 특징
Archives
- Today
- Total
홍시홍의 프로그래밍
[swea 5650] 핀볼 게임 본문
분류 : 구현
요구사항
핀볼 게임을 구현하고, 벽이나 블럭에 접촉하는 최대 횟 수 구하기
풀이
문제에 주어진 대로 구현하면 된다.
모든 정점에서 4방향으로 핀볼 게임을 실행해 본다.
웜홀은 무조건 2개가 주어지는데 vector에 넣어 지금 자신과 다른 정점의 값을 취해준다
종료 조건은
블랙홀에 빠지거나, 시작위치로 다시 돌아왔을때이다.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct go{
int x;
int y;
};
int n;
int map[101][101];
vector<go> v[11];
int dr[4] = {-1,0,1,0};
int dc[4] = {0,-1,0,1};
int ans=0;
int Wall(int dir){
if(dir==0) return 2;
else if(dir==1) return 3;
else if(dir==2) return 0;
else if(dir==3) return 1;
}
int Block(int num, int dir){
if(num==1){
if(dir==1) return 0;
else if(dir==2) return 3;
else if(dir==3) return 1;
else if(dir==0) return 2;
}
else if(num==2){
if(dir==0) return 3;
else if(dir==1) return 2;
else if(dir==2) return 0;
else if(dir==3) return 1;
}
else if(num==3){
if(dir==0) return 1;
else if(dir==1) return 3;
else if(dir==2) return 0;
else if(dir==3) return 2;
}
else if(num==4){
if(dir==0) return 2;
else if(dir==1) return 3;
else if(dir==2) return 1;
else if(dir==3) return 0;
}
}
int solve(int r, int c, int dir){
int sr=r;
int sc=c;
int cnt=0;
while(true){
int nr = r+dr[dir];
int nc = c+dc[dir];
// cout<<nr<<" "<<nc<<endl;
if(nr== sr && nc==sc) break;
if(map[nr][nc]==-1) break;
if(nr<0 || nc<0 || nr>=n || nc>=n){
dir=Wall(dir);
cnt++;
r=nr;
c=nc;
continue;
}
if(map[nr][nc] >=1 && map[nr][nc]<=4){
dir= Block(map[nr][nc],dir);
r=nr, c=nc;
cnt++;
continue;
}
if(map[nr][nc]==5){
dir=Wall(dir);
r=nr, c=nc;
cnt++;
continue;
}
if(map[nr][nc] >=6 && map[nr][nc]<=10){
// cout<<"wall"<<endl;
int flag=0;
for(int i=0 ; i <2 ; i++){
// cout<<i<<endl;
// cout<<v[map[nr][nc]][i].x<<" "<<v[map[nr][nc]][i].y<<endl;
if(v[map[nr][nc]][i].x == nr && v[map[nr][nc]][i].y == nc){
// cout<<"match"<<endl;
flag=i;
}
}
// cout<<"A"<<endl;
//1이면
// cout<<flag<<endl;
if(flag==1){
int newr = v[map[nr][nc]][0].x;
int newc = v[map[nr][nc]][0].y;
nr= newr;
nc = newc;
}
else if(flag==0){
int newr = v[map[nr][nc]][1].x;
int newc = v[map[nr][nc]][1].y;
nr = newr;
nc = newc;
}
r=nr;
c=nc;
//cout<<"D"<<endl;
continue;
}
r=nr;
c=nc;
}
return cnt;
}
int main(){
int t;
scanf("%d",&t);
for(int tc=1;tc<=t;tc++){
ans=0;
for(int i=6;i<=10; i++) v[i].clear();
scanf("%d",&n);
for(int i=0 ; i < n ; i++){
for(int j=0 ; j < n ; j++){
scanf("%d",&map[i][j]);
if(map[i][j]>=6 && map[i][j]<=10){
v[map[i][j]].push_back({i,j});
}
}
}
for(int i=0 ; i < n ; i++){
for(int j=0 ; j < n ; j++){
if(map[i][j]==0){
// cout<<i<<" !! "<<j<<endl;
for(int k=0 ; k <4 ; k++){
// cout<<"dir "<<k<<endl;
ans=max(ans,solve(i,j,k));
}
}
}
}
printf("#%d %d\n",tc,ans);
}
}
'알고리즘 문제풀이 > swea' 카테고리의 다른 글
[swea 1949] 등산로 조성 (0) | 2020.04.25 |
---|---|
[swea 1953] 탈주범 검거 (0) | 2020.04.25 |
[swea 2117] 홈 방범 서비스 (0) | 2020.04.24 |
[swea 2112] 보호 필름 (0) | 2020.04.24 |
[swea 5648] 원자 소멸 시뮬레이션 (0) | 2020.04.22 |
Comments