문제링크 :https://www.acmicpc.net/problem/1063
1063번: 킹
8*8크기의 체스판에 왕이 하나 있다. 킹의 현재 위치가 주어진다. 체스판에서 말의 위치는 다음과 같이 주어진다. 알파벳 하나와 숫자 하나로 이루어져 있는데, 알파벳은 열을 상징하고, 숫자는 �
www.acmicpc.net
문제설명
1. 체스판에 돌의 위치와 킹의 위치가주어진다.
2. 킹이 움직일 위치에 돌이 있으면 돌을 같은 방향으로 밀어낸다.
3. 만약 킹이 움직이거나 돌이 움직일때 체스판 밖으로 나가게 되는 경우에는 움직이지 않고 넘어간다.
4. 킹의 움직임이 주어졌을때 마지막에 킹과 돌의 위치를 출력.
알고리즘
1. 명령에 따라 움직이는 방향함수를 정의 해주고.
2. 킹이 움직일수 있다(경계를 벗어나지 않는다)면 -> 그위치에 돌이 있다면 돌이 움직일 수있는지 확인하여 돌이움직 일 수 있다면 킹과 돌을 움직인다.
3. 킹이 움직일 위치에 돌이없다면 킹을 움직인다.
코드
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | #include<iostream> using namespace std; int map[9][9]; int dy[8] = { 1,1,0,-1,-1,-1,0,1 }; int dx[8] = { 0,1,1,1,0,-1,-1,-1 }; int arrow(string str) { if (str == "T") { return 0; } else if (str == "RT") { return 1; } else if (str == "R") { return 2; } else if (str == "RB") { return 3; } else if (str == "B") { return 4; } else if (str == "LB") { return 5; } else if (str == "L") { return 6; } else if (str == "LT") { return 7; } } int main() { cin.tie(NULL); ios::sync_with_stdio(false); char c; int a; //킹 위치 cin >> c >> a; pair<char, int> king = make_pair(c, a); //돌 위치 cin >> c >> a; pair<char, int> stone = make_pair(c, a); int N; cin >> N; //이동 입력. string str; for (int i = 0; i < N; i++) { cin >> str; int num = arrow(str); pair<char, int> P; int s1; int s2; s1 = king.first - 'A'; s2 = king.second; s1 = s1 + dx[num]; s2 = s2 + dy[num]; //킹이 체스판을 나가면 움직이지 않는다. if (s1 < 0 || s1 >= 8 || s2 < 1 || s2 > 8)continue; P = make_pair(king.first + dx[num], king.second + dy[num]); //킹 자리에 돌이 있었으면 if (P == stone) { s1 = stone.first - 'A'; s2 = stone.second; s1 = s1 + dx[num]; s2 = s2 + dy[num]; //돌이 체스판을 나가면 움직이지않는다. if (s1 < 0 || s1 >= 8 || s2 < 1 || s2 > 8)continue; else { stone = make_pair(stone.first + dx[num], stone.second + dy[num]); } } king = P; } cout << king.first << king.second << "\n"; cout << stone.first << stone.second << "\n"; } | cs |
'c++ > 백준' 카테고리의 다른 글
백준 10942번 : 팰린드롬? (0) | 2020.05.26 |
---|---|
백준 1213번 : 팰린드롬 만들기 (0) | 2020.05.26 |
백준 1004번 : 어린 왕자 (0) | 2020.05.26 |
백준 2790번 : F7 (0) | 2020.05.26 |
백준 10282번 : 해킹 (0) | 2020.05.22 |