홍시홍의 프로그래밍

[swea 5650] 핀볼 게임 본문

알고리즘 문제풀이/swea

[swea 5650] 핀볼 게임

홍시홍 2020. 4. 24. 01:07

분류 : 구현

 

요구사항

핀볼 게임을 구현하고, 벽이나 블럭에 접촉하는 최대 횟 수 구하기

 

풀이

문제에 주어진 대로 구현하면 된다.

 

모든 정점에서 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