九度oj 题目1365:贝多芬第九交响曲
-
现在在一块空的场地上会有一个大的二维棋盘,裁判会给你指定初始位置及一座贝多芬雕像所处的位置,你开始时就站在裁判指定的初始位置处,你的目标是跳到贝多芬雕像的位置。为了给比赛增加一定的难度,你在棋盘上行走时,必须按照中国象棋中的马的走步方式来走。玩过中国象棋的人都知道,马走“日”,象走“田”。最后,你只需要告诉裁判最少多少步能到达贝多芬的雕像。如果根本就到不了贝多芬的雕像处,你直接告诉裁判就可以了。
玄影游侠站在棋盘的某一个位置,不知道该如何走,他知道你们都学过程序设计,所以想请你们帮帮忙编一个程序来帮助他找到想要到达贝多芬的雕像处所需要的最少的步数。
- 输入:
-
每组测试数据可能有多组输入,对于每一组输入,
输入的第一行包括一个整数N(1<=N<=100),代表棋盘的大小是N*N。
输入的第二行包括四个数start_x, start_y, end_x, end_y(1 <= start_x,start_y,end_x,end_y <= N),分别代表你开始时的位置的x坐标和y坐标以及贝多芬雕像的x坐标和y坐标。
- 输出:
-
如果你能够到达贝多芬雕像的位置,请输出最少需要多少步。
如果不能到达,则输出-1。
- 样例输入:
-
3 1 1 3 2 3 1 1 2 2
- 样例输出:
-
1 -1
用广度优先搜索即可1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <queue> 5 using namespace std; 6 int n; 7 int sx,sy,ex,ey; 8 int dir[][2] = {{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1},{-2,1},{-1,2}}; 9 typedef pair<int ,int> P; 10 queue <P> que; 11 int step[102][102]; 12 int ans; 13 14 void bfs() { 15 while(!que.empty()) { 16 P tmp = que.front(); que.pop(); 17 int cnt = step[tmp.first][tmp.second]; 18 if(tmp.first == ex && tmp.second == ey) { 19 ans = cnt-1; 20 break; 21 } 22 for(int i = 0; i < 8; i++) { 23 int x = dir[i][0] + tmp.first; 24 int y = dir[i][1] + tmp.second; 25 if(x >= 1 && y >= 1 && x <= n && y <= n && step[x][y] == 0) { 26 que.push(P(x, y)); 27 step[x][y] = cnt + 1; 28 } 29 } 30 } 31 } 32 int main(int argc, char const *argv[]) 33 { 34 //freopen("input.txt","r",stdin); 35 while(scanf("%d",&n) != EOF) { 36 scanf("%d %d %d %d",&sx,&sy,&ex,&ey); 37 memset(step, 0, sizeof(step)); 38 P start = P(sx, sy); 39 step[sx][sy] = 1; 40 41 while(!que.empty()) { 42 que.pop(); 43 } 44 que.push(start); 45 ans = -1; 46 bfs(); 47 printf("%d\n",ans); 48 } 49 return 0; 50 }