马踏棋盘(简单广搜)

来源:互联网 发布:战舰世界加贺数据 编辑:程序博客网 时间:2024/05/17 22:15
题目来源:http://vjudge.net/contest/toListContest.action

49557

[NWPU][2014][TRN][4]搜索C题

作者:npufz

题目:给定一个8*8的棋盘,然后给定棋子马的初始位置和目标位置,求算出从初始位置到目标位置,所需要的最短步数。

代码:

#include <iostream>#include <queue>using namespace std;int main(){   int h0,h1,a[8][8],i,j,h,w;    char w0,w1;  typedef  pair <int ,char>  wh;  wh wh0;    while(cin>>w0>>h0>>w1>>h1)    { for(i=0;i<8;i++)        for(j=0;j<8;j++)            a[i][j]=0;      h0--;h1--;      queue<wh> que;      while(que.size()) que.pop();      que.push(wh(h0,w0));      while(que.size())     {  wh0=que.front();que.pop();         if(wh0.first==h1&&wh0.second==w1)         {cout<<"To get from "<<w0<<h0+1<<" to "<<w1<<h1+1<<" takes "<<a[h1][w1-'a']<<" knight moves."<<endl;         break;}         h=wh0.first+2;w=wh0.second-'a'+1;         if(h>=0&&h<8&&w<8&&w>=0&&a[h][w]==0&&(w!=w0-'a'||h!=h0))         { a[h][w]=a[wh0.first][wh0.second-'a']+1;           que.push(wh(h,w+'a'));}         h=wh0.first+1;w=wh0.second-'a'+2;         if(h>=0&&h<8&&w<8&&w>=0&&a[h][w]==0&&(w!=w0-'a'||h!=h0))         { a[h][w]=a[wh0.first][wh0.second-'a']+1;           que.push(wh(h,w+'a'));}         h=wh0.first-2;w=wh0.second-'a'-1;         if(h>=0&&h<8&&w<8&&w>=0&&a[h][w]==0&&(w!=w0-'a'||h!=h0))         { a[h][w]=a[wh0.first][wh0.second-'a']+1;           que.push(wh(h,w+'a'));}         h=wh0.first-1;w=wh0.second-'a'-2;         if(h>=0&&h<8&&w<8&&w>=0&&a[h][w]==0&&(w!=w0-'a'||h!=h0))         { a[h][w]=a[wh0.first][wh0.second-'a']+1;           que.push(wh(h,w+'a'));}         h=wh0.first+2;w=wh0.second-'a'-1;         if(h>=0&&h<8&&w<8&&w>=0&&a[h][w]==0&&(w!=w0-'a'||h!=h0))         { a[h][w]=a[wh0.first][wh0.second-'a']+1;           que.push(wh(h,w+'a'));}         h=wh0.first-2;w=wh0.second-'a'+1;         if(h>=0&&h<8&&w<8&&w>=0&&a[h][w]==0&&(w!=w0-'a'||h!=h0))         { a[h][w]=a[wh0.first][wh0.second-'a']+1;           que.push(wh(h,w+'a'));}         h=wh0.first-1;w=wh0.second-'a'+2;         if(h>=0&&h<8&&w<8&&w>=0&&a[h][w]==0&&(w!=w0-'a'||h!=h0))         { a[h][w]=a[wh0.first][wh0.second-'a']+1;           que.push(wh(h,w+'a'));}         h=wh0.first+1;w=wh0.second-'a'-2;         if(h>=0&&h<8&&w<8&&w>=0&&a[h][w]==0&&(w!=w0-'a'||h!=h0))         { a[h][w]=a[wh0.first][wh0.second-'a']+1;           que.push(wh(h,w+'a'));}}}    return 0;}

反思:一开始想的太复杂了,就没有找到头绪,原因是没有理解广搜的特点,后来经过一夜的反思,明白了广搜找到的就是最短的路径,然后就直接写了代码,写代码是把判断条件写错了(数组下标写错了一位,写成了从1开始的下标),并且上述代码有点繁琐,可以用一个循环代替八个方向的判断。





0 0
原创粉丝点击