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
- zoj1091题解
- zoj1091
- zoj1091
- zoj1091
- zoj1091
- zoj1091 Knight Moves
- zoj1091-Knight Moves
- [水]ZOJ1091
- zoj1091 Knight Moves
- zoj1091(深度搜索
- zoj1091(广度搜索
- ZOJ1091 Knight Moves
- zoj1091经典的搜索题目
- zoj1091经典的广搜题目
- UVA439 POJ2243 HDU1372 ZOJ1091 Knight Moves
- 题解
- 题解
- 题解
- 第一周:欧几里得求两个数的公约数
- MOD 之"Hello World"
- 关于在Ubuntu上面安装使用QQ
- Construct Binary Tree from Inorder and Postorder Traversal(给出中序后序求二叉树)
- Java中的i++和i--
- zoj1091题解
- 作业3
- Learning the parts of object by NMF
- HDU 1576 A/B
- <<OCM实验选讲>> 第五课 数据备份恢复实验
- Struts2标签
- cocos2dx场景切换小例子
- JVM调优分享-(概要+例子)
- dede用户登录时,跳转到提示页时报404错误