uva 439骑士的移动(图的最短路 bfs)
2015-05-11 20:57
483 查看
题目:给出国际象棋棋盘中的两个点,求马从一个点跳到另一个点的最少步数。
思路见码:
题目:给出国际象棋棋盘中的两个点,求马从一个点跳到另一个点的最少步数。
思路见码:
#include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<queue> #include<stack> #include<string> #include<map> #include<set> using namespace std; #define LL long long const int maxn=64+5; int dirx[]={2,1,-1,-2,-2,-1,1,2}; int diry[]={-1,-2,-2,-1,1,2,2,1}; int vis[maxn],dist[maxn]; void bfs(int beg,int end){ int ok=0; queue<int> q; q.push(beg);vis[beg]=1;dist[beg]=0; while(!q.empty()&&!ok){ int tmp=q.front();q.pop(); int tmpx=(tmp-1)/8+1,tmpy=(tmp-1)%8+1; for(int i=0;i<8;i++){ int pushx=tmpx+dirx[i],pushy=tmpy+diry[i]; int pushv=(pushx-1)*8+pushy; if(pushx<=0||pushx>8||pushy<=0||pushy>8||vis[pushv]) continue; //printf("%d\n",pushv); q.push(pushv); vis[pushv]=1;dist[pushv]=dist[tmp]+1; if(pushv==end){ok=1;break;} } } } int main(){ //freopen("input.txt","r",stdin); char begy,endy; int begx,endx; while(scanf("%c%d",&begy,&begx)!=EOF){ memset(vis,0,sizeof(vis)); getchar(); scanf("%c%d",&endy,&endx); int nbegy=begy-'a'+1; int nendy=endy-'a'+1; //printf("%d %d\n",endx,nendy); int beg=(begx-1)*8+nbegy,end=(endx-1)*8+nendy; //printf("%d %d\n",beg,end); bfs(beg,end); printf("To get from %c%d to %c%d takes %d knight moves.\n",begy,begx,endy,endx,dist[end]); getchar(); //getchar(); } //for(int i=0;i<8;i++) printf("%d\n",dirx[i]); return 0; }
相关文章推荐
- uva 439 Knight Moves(骑士的移动)BFS
- UVa 439骑士的移动(BFS)
- UVA 439 BFS 骑士的移动
- Uva 439 骑士的移动
- UVa - 439 - Knight Moves(bfs求最短路)
- uva-439 骑士的移动
- UVA 439 骑士(Knight Moves ) 很基础的BFS
- 习题6-4 骑士的移动 UVa439
- uva 439 Knight Moves 骑士移动
- 骑士的移动(Knight Moves, UVa 439)
- uva 439 Knight Moves 骑士移动
- 习题 6-4 UVA 439 Knight Moves 骑士的移动
- uva439 - Knight Moves(BFS求最短路)
- UVa439(BFS最短路实现)
- 骑士的移动搜索 UVA439
- UVA 439 (骑士移动 第一道DFS 13.07.17)
- 骑士的移动(Knight Moves,UVa 439)
- 习题6-4 骑士的移动(Knight Moves, UVa 439)
- 习题6-4 骑士的移动 UVa 439
- UVA439 水,枚举+BFS