zoj 1091 Kniget Moves(bfs)

来源:互联网 发布:intelj java.util.map 编辑:程序博客网 时间:2024/04/30 13:14
            确实写了几道广度优先遍历之后,这种题目很容易就可以写出来了大笑,这个题目只是让求出最短路径而已,并没有让把路径给打印出来,所以呢,是深度优先遍历中比较简单的题目啦,不过这道题目好像没有说骑士怎么走法啊,还好看了学姐的博客,和象棋里面的马走法一样,是一个‘日’字,所以呢,一共有八种情况,慢慢遍历就可以了,都这么晚了,该睡觉了,广度优先遍历就先到这吧,算是掌握了,明天开始深搜吧,继续完善自己奋斗
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<queue>using namespace std;int map[10][10];int visit[10][10];int dist[10][10];typedef struct{int i,j;}node;int bfs(int x1,int y1,int x2,int y2){node t,w;t.i=x1;t.j=y1;    dist[x1][y1]=0;    visit[x1][y1]=1;    int k;queue<node>q;q.push(t);int step[8][2]={-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1};while(!q.empty()){t=q.front();q.pop();if(t.i==x2&&t.j==y2)return dist[t.i][t.j];else{for(k=0;k<8;k++){w.i=t.i+step[k][0];w.j=t.j+step[k][1];if(w.i>0&&w.j>0&&w.i<=8&&w.j<=8&&!visit[w.i][w.j]){q.push(w);dist[w.i][w.j]=dist[t.i][t.j]+1;visit[w.i][w.j]=1;}}}}}int main(){int i,j,x1,y1,x2,y2;char m,n,p;while(scanf("%c%d%c%c%d",&m,&x1,&p,&n,&x2)!=EOF){getchar();memset(visit,0,sizeof(visit));memset(dist,0,sizeof(dist));int y1=m-'a'+1;int y2=n-'a'+1;int ans=bfs(x1,y1,x2,y2);printf("To get from %c%d to %c%d takes %d knight moves.\n",m,x1,n,x2,ans);}}

0 0
原创粉丝点击