ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 구슬탈출2
    백준알고리즘 2019. 8. 6. 00:54
    #include<iostream>
    
    using namespace std;
    
    int h, w;
    int map[10][10];
    struct ball {
    	int x, y;
    	bool in = true;
    };
    ball r;
    ball b;
    int ans = 11;
    
    
    void go(int dir, int cnt, int rx, int ry, int bx, int by) {//1은 아래로 2는 위로 3은 오른쪽으로 4는 왼쪽으루
    	if (ans <= cnt) return;
    	r.in = true; b.in = true;
    	map[rx][ry] = 1; map[bx][by] = 2;
    	bool mr = false; bool mb = false;
    	bool rin = true; bool bin = true;
    	
    	if (dir == 1) {
    
    			for (int i = 1; i < h - 1; i++) {
    				if (rx > bx) {
    					if (map[rx + 1][ry] == 3) {
    						map[rx][ry] = 0;
    						rin = false;
    						mr = true;
    					}
    					if (map[rx + 1][ry] == 0) {
    						map[rx][ry] = 0;
    						rx += 1;
    						map[rx][ry] = 1;
    						mr = true;
    					}
    					if (map[bx + 1][by] == 0) {
    						map[bx][by] = 0;
    						bx += 1;
    						map[bx][by] = 2;
    						mb = true;
    					}
    					if (map[bx + 1][by] == 3) {
    						map[bx][by] = 0;
    						bin = false;
    						mb = true;
    					}
    				}
    				else {
    					if (map[rx + 1][ry] == 3) {
    						map[rx][ry] = 0;
    						rin = false; mr = true;
    					}
    					if (map[bx + 1][by] == 0) {
    						map[bx][by] = 0;
    						bx += 1;
    						map[bx][by] = 2; mb = true;
    					}
    					if (map[rx + 1][ry] == 0) {
    						map[rx][ry] = 0;
    						rx += 1; mr = true;
    						map[rx][ry] = 1;
    					}
    					if (map[bx + 1][by] == 3) {
    						map[bx][by] = 0;
    						bin = false; mb = true;
    
    					}
    				}
    			}
    		
    	}
    
    	if (dir == 2) {
    			for (int i = 1; i < h - 1; i++) {
    				if (r.x < b.x) {
    					if (map[rx - 1][ry] == 3) {
    						map[rx][ry] = 0;
    						rin = false; mr = true;
    					}
    					if (map[rx - 1][ry] == 0) {
    						map[rx][ry] = 0;
    						rx -= 1; mr = true;
    						map[rx][ry] = 1;
    					}
    					if (map[bx - 1][by] == 0) {
    						map[bx][by] = 0;
    						bx -= 1;
    						map[bx][by] = 2; mb = true;
    					}
    					if (map[bx - 1][by] == 3) {
    						map[bx][by] = 0;
    						bin = false;
    						mb = true;
    					}
    				}
    				else {
    					if (map[rx - 1][ry] == 3) {
    						map[rx][ry] = 0;
    						rin = false; mr = true;
    					}
    					if (map[bx - 1][by] == 0) {
    						map[bx][by] = 0;
    						bx -= 1;
    						map[bx][by] = 2; mb = true;
    					}
    					if (map[rx - 1][ry] == 0) {
    						map[rx][ry] = 0;
    						rx -= 1; mr = true;
    						map[rx][ry] = 1;
    					}
    					
    					if (map[bx - 1][by] == 3) {
    						map[bx][by] = 0;
    						bin = false; mb = true;
    					}
    				}
    			}
    		
    	}
    
    	if (dir == 3) {
    	
    			for (int i = 1; i < w - 1; i++) {
    				bool hole = false;
    				if (ry > by) {
    
    					if (map[rx][ry + 1] == 3) {
    						map[rx][ry] = 0;
    						rin = false; mr = true;
    					}
    					if (map[rx][ry + 1] == 0) {
    						map[rx][ry] = 0; mr = true;
    						ry += 1;
    						map[rx][ry] = 1;
    					}
    					if (map[bx][by + 1] == 3) {
    						map[bx][by] = 0;
    						bin = false; mb = true;
    					}
    					if (map[bx][by + 1] == 0) {
    						map[bx][by] = 0; 
    						by += 1;
    						map[bx][by] = 2; mb = true;
    					}
    					
    				}
    				else {
    					
    					if (map[bx][by+1] == 0) {
    						map[bx][by] = 0;
    						by += 1; mb = true;
    						map[bx][by] = 2;
    					}
    					if (map[bx][by + 1] == 3) {
    						map[bx][by] = 0;
    						bin = false; mb = true;
    
    					}
    					if (map[rx][ry + 1] == 0) {
    						map[rx][ry] = 0;
    						ry += 1;
    						map[rx][ry] = 1; mr = true;
    					}
    		
    					if (map[rx][ry + 1] == 3) {
    						map[rx][ry] = 0;
    						rin = false; mr = true;
    					}
    				}
    			}
    		
    	}
    
    	if (dir == 4) {
    		
    			for (int i = 1; i < w - 1; i++) {
    				if (ry < by) {
    					if (map[rx][ry - 1] == 3) {
    						map[rx][ry] = 0;
    						rin = false; mr = true;
    					}
    					if (map[rx][ry - 1] == 0) {
    						map[rx][ry] = 0;
    						ry -= 1; mr = true;
    						map[rx][ry] = 1;
    					}
    					if (map[bx][by - 1] == 0) {
    						map[bx][by] = 0; mb = true;
    						by -= 1;
    						map[bx][by] = 2;
    					}
    					if (map[bx][by - 1] == 3) {
    						map[bx][by] = 0;
    						mb = true;
    						bin = false;
    					}
    				}
    				else {
    					if (map[rx][ry - 1] == 3) {
    						map[rx][ry] = 0;
    						rin = false; mr = true;
    					}
    					if (map[bx][by - 1] == 0) {
    						map[bx][by] = 0;
    						by -= 1; mb = true;
    						map[bx][by] = 2;
    					}
    					if (map[rx][ry - 1] == 0) {
    						map[rx][ry] = 0;
    						ry -= 1;
    						map[rx][ry] = 1; mr = true;
    					}
    					if (map[bx][by - 1] == 3) {
    						map[bx][by] = 0; mb = true;
    						bin = false;
    					}
    				}
    			}
    		
    	}
    	if (dir != 0) {
    		if (mr == false && mb == false) {
    			map[rx][ry] = 0; map[bx][by] = 0;
    			return;
    		}
    	}
    	/*cout << endl;
    
    	cout << dir << endl;
    	for (int i = 0; i < h; i++) {
    		for (int j = 0; j < w; j++) {
    			cout << map[i][j] << " ";
    		}
    		cout << endl;
    	}*/
    	
    	
    	if (bin == false) { map[rx][ry] = 0; map[bx][by] = 0; return; }
    
    	if (!rin) {
    		if (ans > cnt) ans = cnt;
    		map[rx][ry] = 0; map[bx][by] = 0;
    		return;
    	}
    
    	for (int i = 1; i <= 4; i++) {
    		map[rx][ry] = 1; map[bx][by] = 2;
    		go(i, cnt+1,rx,ry,bx,by);
    		map[rx][ry] = 0; map[bx][by] = 0;
    	}
    	//map[rx][ry] = 0; map[bx][by] = 0;
    	
    }
    
    int main() {
    	cin >> h >> w;
    
    	for (int i = 0; i < h; i++) {
    		for (int j = 0; j < w; j++) {
    			char x;
    			cin >> x;
    			//cout << x << endl;
    			if (x == '#') {
    				map[i][j] = 4;
    			}
    			if (x == '.')
    				map[i][j] = 0;
    			if (x == 'R')
    			{
    				//map[i][j] = 1;
    				r.x = i;
    				r.y = j;
    
    			}
    			if (x == 'B') {
    				//map[i][j] = 2;
    				b.x = i;
    				b.y = j;
    			}
    			if (x == 'O')
    				map[i][j] = 3;
    		}
    	}
    	
    	
    	go(0, 0,r.x,r.y, b.x, b.y);
    	
    	if (ans == 11)
    		cout << -1 << endl;
    	else
    		cout << ans << "\n";
    	return 0;
    
    
    
    }

    방향마다 움직임제어 함수내부에서 백트래킹실행

    만약, 아무것도 움직이지 않는경우라면 어차피 거기서 더이상 하는것은 쓸모가없다고 판단해서 bool로 판단하고 리턴시키는과정이포함되있고 처음에 인자로 함수를 정의 안했는데, 이렇게 안하면 맵이 굉장히 혼란스러워져서 그냥 인자로 함수를 구성했다.

     

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

    스타트와 링크  (0) 2019.08.08
    로봇청소기  (0) 2019.08.08
    치킨배달  (0) 2019.08.02
    경사로  (0) 2019.08.02
    미로탐색  (0) 2019.08.01

    댓글

Designed by Tistory.