본문 바로가기

[Algorithms]/[Problems]

BOJ. 19236번. 청소년상어

728x90

청소년 상어 문제는 그래도 그렇저럭 풀만했다...... 아닌가.....;;;;

물고기의 움직임 각각의 상태마다 상어가 움직이면서 그 map의 상태를 들고 다녀야 한다. 그 점만 유의해서 풀면 잘...해결할 수 있다......

www.acmicpc.net/problem/19236

 

19236번: 청소년 상어

첫째 줄부터 4개의 줄에 각 칸의 들어있는 물고기의 정보가 1번 행부터 순서대로 주어진다. 물고기의 정보는 두 정수 ai, bi로 이루어져 있고, ai는 물고기의 번호, bi는 방향을 의미한다. 방향 bi는

www.acmicpc.net

package week8;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Day7BOJ19236 {

	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static StringTokenizer st;
	
	static int n=4,ans=0;
	static int [] dy = {-1,-1, 0, 1, 1, 1, 0,-1};
	static int [] dx = { 0,-1,-1,-1, 0, 1, 1, 1};
//	static Fish[][] map = new Fish[4][4];
	
	static class Fish{
		int num,dir;
		boolean isDead;
		public Fish(int num,int dir,boolean isDead) {
			this.num = num;
			this.dir = dir;
			this.isDead = isDead;
		}
	}
	
	private static boolean checkBound(int y, int x) {
		return (y>=0 && y<n && x>=0 && x<n) ? true : false;
	}
	
	private static void rotate(int y, int x, Fish[][] map) {
		for(int nnum=1; nnum<=16; nnum++) {
	fish:  for (int i = 0; i < n; i++) {
				for (int j = 0; j < n; j++) {
					if (map[i][j].num == nnum && !map[i][j].isDead) {
						int cnt =0;
						while(cnt<8) {
							int ddir = map[i][j].dir%8;
							int ny = i+dy[ddir];
							int nx = j+dx[ddir];
							if(!checkBound(ny,nx) || (y==ny && x==nx)) {
								map[i][j].dir++;
								cnt++;
								continue;
							}
							Fish temp = map[ny][nx];
							map[ny][nx] = map[i][j];
							map[i][j] = temp;
							break fish;
						}
					}
				}
			}
		}
	}
	
	private static void solution(int y,int x,int dir,int sum,Fish[][] map) {
		sum += map[y][x].num;
		dir = map[y][x].dir;
		map[y][x].isDead = true;
		
		ans = Math.max(ans, sum);
		rotate(y, x, map);
		
		for(int d=1; d<4; d++) {
			int ny = y + dy[dir]*d;
			int nx = x + dx[dir]*d;

			if(!checkBound(ny,nx)) break;
			if(map[ny][nx].isDead) continue;

			Fish mmap [][] = new Fish[4][4];
			for (int i = 0; i < 4; i++) {
				for (int j = 0; j < 4; j++) {
					mmap[i][j] = new Fish(map[i][j].num,map[i][j].dir,map[i][j].isDead);
				}
			}
			solution(ny, nx, dir, sum, mmap);
		}
	}
	
	public static void main(String[] args) throws IOException {
		Fish[][] map = new Fish[4][4];
		for(int i=0; i<n; i++) {
			st = new StringTokenizer(br.readLine());
			for(int j=0; j<n; j++) {
				int num = Integer.parseInt(st.nextToken());
				int dir = Integer.parseInt(st.nextToken())-1;
				map[i][j] = new Fish(num,dir,false);
			}
		}
		solution(0,0,0,0,map);
		System.out.println(ans);
	}
	
}

 

728x90

'[Algorithms] > [Problems]' 카테고리의 다른 글

BOJ. 11559번. Puyo Puyo  (0) 2021.03.17
BOJ. 17143번. 낚시왕  (0) 2021.03.16
BOJ. 19237번. 어른상어  (0) 2021.03.14
BOJ. 16236번. 아기상어  (0) 2021.03.14
BOJ. 20058번. 마법사 상어와 파이어스톰  (0) 2021.03.11