문제 요약 : 체스 판의 크기와 출발점, 도착점이 주어지는데, 프로그래머는 출발점에서 시작하여 도착점으로 몇번 만에 도착하는가를 출력해야 합니다.
알고리즘 : BFS
자료구조 : 원형 큐(배열로 구현)
느낀 점 : STL의 deque... 엄청나게 느리다는 것.
Accept된 소스 코드
#include<iostream>
using namespace std;
typedef struct {
int x, y;
}Point;
const int qSize = 90000;
Point q[qSize];
int pop = 0, push = 0;
int N, boardSize;
Point first, end, cur;
int board[300][300];
int curValue, childValue;
int left1, left2, right1, right2, up1, up2, down1, down2;
void init() {
for(int i = 0; i < 300; i++) {
for(int j = 0; j < 300; j++) {
board[i][j] = -1;
}
}
pop = 0;
push = 0;
}
int BFS() {
while(pop != push) {
cur.x = q[pop].x;
cur.y = q[pop].y;
pop = (pop + 1) % qSize;
curValue = board[cur.x][cur.y];
childValue = curValue + 1;
if(cur.x == end.x && cur.y == end.y) return curValue;
left1 = cur.x - 1;
left2 = cur.x - 2;
right1 = cur.x + 1;
right2 = cur.x + 2;
up1 = cur.y - 1;
up2 = cur.y - 2;
down1 = cur.y + 1;
down2 = cur.y + 2;
if(left1 >= 0 && left1 < boardSize) {
if(up2 >= 0 && up2 < boardSize) {
if(board[left1][up2] == -1) {
q[push].x = left1;
q[push].y = up2;
push = (push + 1) % qSize;
board[left1][up2] = childValue;
}
}
if(down2 >= 0 && down2 < boardSize) {
if(board[left1][down2] == -1) {
q[push].x = left1;
q[push].y = down2;
push = (push + 1) % qSize;
board[left1][down2] = childValue;
}
}
}
if(left2 >= 0 && left2 < boardSize) {
if(up1 >= 0 && up1 < boardSize) {
if(board[left2][up1] == -1) {
q[push].x = left2;
q[push].y = up1;
push = (push + 1) % qSize;
board[left2][up1] = childValue;
}
}
if(down1 >= 0 && down1 < boardSize) {
if(board[left2][down1] == -1) {
q[push].x = left2;
q[push].y = down1;
push = (push + 1) % qSize;
board[left2][down1] = childValue;
}
}
}
if(right1 >= 0 && right1 < boardSize) {
if(up2 >= 0 && up2 < boardSize) {
if(board[right1][up2] == -1) {
q[push].x = right1;
q[push].y = up2;
push = (push + 1) % qSize;
board[right1][up2] = childValue;
}
}
if(down2 >= 0 && down2 < boardSize) {
if(board[right1][down2] == -1) {
q[push].x = right1;
q[push].y = down2;
push = (push + 1) % qSize;
board[right1][down2] = childValue;
}
}
}
if(right2 >= 0 && right2 < boardSize) {
if(up1 >= 0 && up1 < boardSize) {
if(board[right2][up1] == -1) {
q[push].x = right2;
q[push].y = up1;
push = (push + 1) % qSize;
board[right2][up1] = childValue;
}
}
if(down1 >= 0 && down1 < boardSize) {
if(board[right2][down1] == -1) {
q[push].x = right2;
q[push].y = down1;
push = (push + 1) % qSize;
board[right2][down1] = childValue;
}
}
}
}
}
int main() {
//freopen("input.txt", "r", stdin);
cin >> N;
while(N--) {
cin >> boardSize;
cin >> first.x >> first.y;
cin >> end.x >> end.y;
init();
board[first.x][first.y] = 0;
q[push].x = first.x;
q[push].y = first.y;
push = (push + 1) % qSize;
cout << BFS() << endl;
}
return 0;
}
'알고리즘' 카테고리의 다른 글
| Prime Gap (0) | 2010.08.28 |
|---|---|
| Palindrome Numbers (2) | 2010.08.05 |
| The Tourist Guide (0) | 2010.08.03 |
| Word Index (0) | 2010.07.31 |