zoj1091题解

来源:互联网 发布:网络ip地址怎么修改 编辑:程序博客网 时间:2024/06/01 07:30

题目解读:这个问题的大意就是在一个8*8的棋盘里,马从棋盘上一个点跳到另外一个点的最短距离(马走日字形)。

解题思路:解决这道题目的关键是熟练掌握BFS算法,即从源点开始广度优先搜索,直到搜索到目标节点为止,第一次搜索到该节点就是最短路径。

具体问题:首先思考有没有做过类似的问题?答案是肯定的,我们曾经使用BFS搜索遍历整个图。我们可以借鉴当时的思路,只是需要在入队时判断是否是目标节点,如果是,就返回最短路径。需要记录每个节点的信息包括:该节点是否已访问?该节点的深度是多少?从一个节点转移到另一个节点时需要记录这些信息。从一个节点扩展的方法采用的是通过数组循环的方式避免重复,提高代码的可读性。

#include<iostream>#include<string.h>#include<queue>using namespace std;#define maxN 100001int visited[64],dist[64];int bfs(int s,int t){memset(visited,0,sizeof(visited));memset(dist,0,sizeof(dist));int i,nx,ny,cur;int x=s/8;int y=s%8;int lx=t/8;int ly=t%8;int dx[8]={-2,-1,1,2,2,1,-1,-2};int dy[8]={1,2,2,1,-1,-2,-2,-1};visited[s]=1;dist[s]=0;    queue<int> q;q.push(s);if(s==t)return 0;while(!q.empty()){int now=q.front();q.pop();x=now/8;y=now%8;for(i=0;i<8;i++){nx=x+dx[i];ny=y+dy[i];cur=nx*8+ny;if(nx>=0&&nx<8&&ny>=0&&ny<8&&!visited[cur]){if(nx==lx&&ny==ly){dist[cur]=dist[now]+1;return dist[cur];}visited[cur]=1;dist[cur]=dist[now]+1;q.push(cur);}}}return -1;}int main(){char a,b,c,d;int s,t;while(cin>>a>>b>>c>>d){s=(a-'a')*8+b-'1';t=(c-'a')*8+d-'1';    cout<<"To get from "<<a<<b<<" to "<<c<<d<<" takes "<<bfs(s,t)<<" knight moves."<<endl;}}



0 0