- 题目描述
原题来自:POJ 1915
编写一个程序,计算一个骑士从棋盘上的一个格子到另一个格子所需的最小步数。骑士一步可以移动到的位置由下图给出。
输入格式第一行给出骑士的数量 nn。
在接下来的 3n3n 行中,每 33 行描述了一个骑士。其中,- 第一行一个整数 LL 表示棋盘的大小,整个棋盘大小为 L\times LL×L;
- 第二行和第三行分别包含一对整数 (x,y)(x,y),表示骑士的起始点和终点。假设对于每一个骑士,起始点和终点均合理。
对每一个骑士,输出一行一个整数表示需要移动的最小步数。如果起始点和终点相同,则输出 00。
样例Input Output 3 8 0 0 7 0 100 0 0 30 50 10 1 1 1 1
5 28 0
对于 100\%100% 的数据,有 4\le L\le 3004≤L≤300,保证 0\le x,y\le L-10≤x,y≤L−1。
- 思路
广搜样板题,不细说了 - 代码
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> using namespace std; int t,n,sx,sy,ex,ey,nx,ny; int vis[333][333]; int step[333][333]; int main() { scanf("%d",&t); for(int i=0;i<t;i++) { scanf("%d%d%d%d%d",&n,&sx,&sy,&ex,&ey); queue<int>qx,qy; qx.push(sx),qy.push(sy); vis[sx][sy]=1; step[sx][sy]=0; while(!qx.empty()&&!qy.empty()) { nx=qx.front(),qx.pop(); ny=qy.front(),qy.pop(); if(nx==ex&&ny==ey) { break; } if(nx-2>=0&&ny+1<=n&&vis[nx-2][ny+1]==0) { qx.push(nx-2); qy.push(ny+1); step[nx-2][ny+1]=step[nx][ny]+1; vis[nx-2][ny+1]=1; } if(nx-2>=0&&ny-1>=0&&vis[nx-2][ny-1]==0) { qx.push(nx-2); qy.push(ny-1); step[nx-2][ny-1]=step[nx][ny]+1; vis[nx-2][ny-1]=1; } if(nx-1>=0&&ny+2<=n&&vis[nx-1][ny+2]==0) { qx.push(nx-1); qy.push(ny+2); step[nx-1][ny+2]=step[nx][ny]+1; vis[nx-1][ny+2]=1; } if(nx-1>=0&&ny-2>=0&&vis[nx-1][ny-2]==0) { qx.push(nx-1); qy.push(ny-2); step[nx-1][ny-2]=step[nx][ny]+1; vis[nx-1][ny-2]=1; } if(nx+1<=n&&ny+2<=n&&vis[nx+1][ny+2]==0) { qx.push(nx+1); qy.push(ny+2); step[nx+1][ny+2]=step[nx][ny]+1; vis[nx+1][ny+2]=1; } if(nx+2<=n&&ny+1<=n&&vis[nx+2][ny+1]==0) { qx.push(nx+2); qy.push(ny+1); step[nx+2][ny+1]=step[nx][ny]+1; vis[nx+2][ny+1]=1; } if(nx+2<=n&&ny-1>=0&&vis[nx+2][ny-1]==0) { qx.push(nx+2); qy.push(ny-1); step[nx+2][ny-1]=step[nx][ny]+1; vis[nx+2][ny-1]=1; } if(nx+1<=n&&ny-2>=0&&vis[nx+1][ny-2]==0) { qx.push(nx+1); qy.push(ny-2); step[nx+1][ny-2]=step[nx][ny]+1; vis[nx+1][ny-2]=1; } } memset(vis,0,sizeof(vis)); printf("%d\n",step[ex][ey]); } return 0; }
相关文章
- 12-05kuangbin专题 专题一 简单搜索 Fire! UVA - 11624
- 12-05【kuangbin题集】专题一 简单搜索
- 12-05hdu1181 dfs 字符串首尾可拼接,问是否可寻找到一条字串路径使得首尾分别是‘b’和‘m’,简单的搜索+回溯
- 12-05专题一搜索 J - 山峰和山谷 Ridges and Valleys
- 12-05专题一搜索 B - Knight Moves
- 12-05搜索专题——每日一练
- 12-05专题一搜索 A - Biggest Number
- 12-05[宽度优先搜索] HDU 1372 Knight Moves
- 12-05kuangbin专题 专题一 简单搜索 Dungeon Master POJ - 2251
- 12-05[kuangbin带你飞]专题一 简单搜索 题解报告