ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BOJ 17837 : 새로운 게임 2
    알고리즘 2023. 8. 27. 16:02

    #BOJ 17837 : 새로운 게임 2

     

    17837번: 새로운 게임 2

    재현이는 주변을 살펴보던 중 체스판과 말을 이용해서 새로운 게임을 만들기로 했다. 새로운 게임은 크기가 N×N인 체스판에서 진행되고, 사용하는 말의 개수는 K개이다. 말은 원판모양이고, 하

    www.acmicpc.net

    #풀이

    구현문제는 너무 실수가 많네요.....

     

    문제는 쉬운데... 

     

    일단 저는 체스판을 3차원벡터로 선언하여 체스말들을 추가할 수 있게 만들었습니다.

     

    그리고 방향으로 보고 체스판의 색깔을 구분합니다.

     

    파란색 또는 체스판 바깥

    조건에 맞게 파란색일 때 방향을 바꿔주고 가야할 칸의 색깔을 판별합니다.

     

    빨간색

    내가 움직이는 말을 순서를 바꾼다.

    순서를 바꿀 때는 deque를 사용했다.

     

    빈칸

    그냥 움직인다.

     

    여기서 중요한게 항상 움직일 때마다 체스말들의 벡터를 최신화해줘야 한다.

     

    #코드

    #include<iostream>
    #include<vector>
    #include<tuple>
    #include<queue>
    #include<deque>
    using namespace std;
    
    int n, k;
    int arr[13][13];
    tuple<int, int, int>v[11];
    int ans = 0;
    vector<vector<vector<int>>>v2(13, vector<vector<int>>(13, vector<int>(0)));
    
    bool Check() {
    	for (int i = 1; i <= n; i++) {
    		for (int j = 1; j <= n; j++) {
    			if (v2[i][j].size() >= 4)
    				return 1;
    		}
    	}
    	return 0;
    
    }
    
    void move(tuple<int, int, int> A, int num) {
    	int x, y, d;
    	tie(x, y, d) = A;
    
    	if (d == 1) // 오른쪽으로
    	{
    		if (arr[x][y + 1] == 2 || y == n)//파란색
    		{
    			if (arr[x][y - 1] == 2 || y - 1 <1) {
    				v[num] = { x,y,2 };
    				return;
    			}
    			else {
    				v[num] = { x,y,2 };
    				move({ x,y,2 }, num);
    			}
    		}
    		else if (arr[x][y + 1] == 1) //빨간색
    		{
    			deque<int> dq;
    			bool flag = 0;
    			for (int i = 0; i < v2[x][y].size(); i++) {
    				if (v2[x][y][i] == num)
    					flag = 1;
    				if (flag) {
    					int xx, yy, ddir;
    					tie(xx, yy, ddir) = v[v2[x][y][i]];
    					v[v2[x][y][i]] = { xx,yy + 1, ddir };
    					dq.push_back(v2[x][y][i]);
    					v2[x][y].erase(v2[x][y].begin() + i);
    					i--;
    				}
    			}
    			while (!dq.empty()) {
    				int c = dq.back(); dq.pop_back();
    				v2[x][y + 1].push_back(c);
    			}
    		}
    		
    		else if(arr[x][y+1] == 0) // 빈 칸
    		{
    			bool flag = 0;
    			for (int i = 0; i < v2[x][y].size(); i++) {
    				if (v2[x][y][i] == num)
    					flag = 1;
    				if (flag) {
    					int xx, yy, ddir;
    					tie(xx, yy, ddir) = v[v2[x][y][i]];
    					v[v2[x][y][i]] = { xx,yy + 1, ddir };
    					v2[x][y + 1].push_back(v2[x][y][i]);
    					v2[x][y].erase(v2[x][y].begin() + i);
    					i--;
    				}
    			}
    		}
    		
    
    	}
    
    	else if (d == 2)//왼쪽으로
    	{
    		if (arr[x][y - 1] == 2 || y == 1)//파란색
    		{
    			if (arr[x][y + 1] == 2 || y + 1 > n) {
    				v[num] = { x,y,1 };
    				return;
    			}
    			else {
    				v[num] = { x,y,1 };
    				move({ x,y,1 }, num);
    			}
    		}
    		else if (arr[x][y - 1] == 1) //빨간색
    		{
    			deque<int> dq;
    			bool flag = 0;
    			for (int i = 0; i < v2[x][y].size(); i++) {
    				if (v2[x][y][i] == num)
    					flag = 1;
    				if (flag) {
    					int xx, yy, ddir;
    					tie(xx, yy, ddir) = v[v2[x][y][i]];
    					v[v2[x][y][i]] = { xx,yy - 1, ddir };
    					dq.push_back(v2[x][y][i]);
    					v2[x][y].erase(v2[x][y].begin() + i);
    					i--;
    				}
    			}
    			while (!dq.empty()) {
    				int c = dq.back(); dq.pop_back();
    				v2[x][y - 1].push_back(c);
    			}
    		}
    		else if (arr[x][y - 1] == 0) // 빈 칸
    		{
    			bool flag = 0;
    			for (int i = 0; i < v2[x][y].size(); i++) {
    				if (v2[x][y][i] == num)
    					flag = 1;
    				if (flag) {
    					int xx, yy, ddir;
    					tie(xx, yy, ddir) = v[v2[x][y][i]];
    					v[v2[x][y][i]] = { xx,yy - 1, ddir };
    					v2[x][y - 1].push_back(v2[x][y][i]);
    					v2[x][y].erase(v2[x][y].begin() + i);
    					i--;
    				}
    			}
    		}
    	}
    
    	else if (d == 3) //위로
    	{
    		if (arr[x - 1][y] == 2 || x == 1)//파란색
    		{
    			if (arr[x + 1][y] == 2 || x + 1 > n) {
    				v[num] = { x,y,4 };
    				return;
    			}
    			else {
    				v[num] = { x,y,4 };
    				move({ x,y,4 }, num);
    			}
    		}
    		else if (arr[x-1][y] == 1) //빨간색
    		{
    			deque<int> dq;
    			bool flag = 0;
    			for (int i = 0; i < v2[x][y].size(); i++) {
    				if (v2[x][y][i] == num)
    					flag = 1;
    				if (flag) {
    					int xx, yy, ddir;
    					tie(xx, yy, ddir) = v[v2[x][y][i]];
    					v[v2[x][y][i]] = { xx-1,yy, ddir };
    					dq.push_back(v2[x][y][i]);
    					v2[x][y].erase(v2[x][y].begin() + i);
    					i--;
    				}
    			}
    			while (!dq.empty()) {
    				int c = dq.back(); dq.pop_back();
    				v2[x-1][y].push_back(c);
    			}
    		}
    		else if(arr[x-1][y] == 0) // 빈 칸
    		{
    			bool flag = 0;
    			for (int i = 0; i < v2[x][y].size(); i++) {
    				if (v2[x][y][i] == num)
    					flag = 1;
    				if (flag) {
    					int xx, yy, ddir;
    					tie(xx, yy, ddir) = v[v2[x][y][i]];
    					v[v2[x][y][i]] = { xx-1,yy, ddir };
    					v2[x-1][y].push_back(v2[x][y][i]);
    					v2[x][y].erase(v2[x][y].begin() + i);
    					i--;
    				}
    			}
    		}
    	}
    
    	else // 아래로
    	{
    		if (arr[x + 1][y] == 2 || x == n)//파란색
    		{
    			if (arr[x - 1][y] == 2 || x - 1 < 1) {
    				v[num] = { x,y,3 };
    				return;
    			}
    			else {
    				v[num] = { x,y,3 };
    				move({ x,y,3 }, num);
    			}
    		}
    	else if (arr[x+1][y] == 1) //빨간색
    	{
    		deque<int> dq;
    		bool flag = 0;
    		for (int i = 0; i < v2[x][y].size(); i++) {
    			if (v2[x][y][i] == num)
    				flag = 1;
    			if (flag) {
    				int xx, yy, ddir;
    				tie(xx, yy, ddir) = v[v2[x][y][i]];
    				v[v2[x][y][i]] = { xx+1,yy, ddir };
    				dq.push_back(v2[x][y][i]);
    				v2[x][y].erase(v2[x][y].begin() + i);
    				i--;
    			}
    		}
    		while (!dq.empty()) {
    			int c = dq.back(); dq.pop_back();
    			v2[x+1][y].push_back(c);
    		}
    	}
    	
    	else if (arr[x+1][y] == 0) // 빈 칸
    	{
    		bool flag = 0;
    		for (int i = 0; i < v2[x][y].size(); i++) {
    			if (v2[x][y][i] == num)
    				flag = 1;
    			if (flag) {
    				int xx, yy, ddir;
    				tie(xx, yy, ddir) = v[v2[x][y][i]];
    				v[v2[x][y][i]] = { xx+1,yy, ddir };
    				v2[x+1][y].push_back(v2[x][y][i]);
    				v2[x][y].erase(v2[x][y].begin() + i);
    				i--;
    			}
    		}
    	}
    	}
    }
    void solved(int cur) {
    	if (cur > 1000)
    	{
    		ans = -1;
    		return;
    	}
    
    	
    
    	for (int i = 1; i <= k; i++) {
    		move(v[i], i);
    		if (Check()) {
    			ans = cur;
    			return;
    		}
    	}
    	solved(cur + 1);
    	
    }
    int main() {
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	cin >> n >> k;
    	for (int i = 1; i <= n; i++) {
    		for (int j = 1; j <= n; j++) {
    			cin >> arr[i][j];
    		}
    	}
    
    	for (int i = 1; i <= k; i++) {
    		int x, y, dir;
    		cin >> x >> y >> dir;
    		v[i]= { x,y,dir };
    		v2[x][y].push_back(i);
    	}
    
    	solved(1);
    
    	cout << ans << '\n';
    	return 0;
    }

     

    '알고리즘' 카테고리의 다른 글

    BOJ 17825: 주사위 윷놀이  (0) 2023.08.30
    BOJ 17822 : 원판 돌리기  (1) 2023.08.27
    BOJ 17779 : 게리맨더링 2  (0) 2023.08.25
    BOJ 17142 연구소 3  (0) 2023.08.23
    BOJ 17143 : 낚시왕  (0) 2023.08.23
Designed by Tistory.