马踏棋盘(简单广搜)

本文介绍了如何解决8*8棋盘上,马从初始位置到达目标位置的最短步数问题。通过搜索算法进行求解,提供源代码详细解析。
摘要由CSDN通过智能技术生成
题目来源:http://vjudge.net/contest/toListContest.action

49557

作者: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开始的下标),并且上述代码有点繁琐,可以用一个循环代替八个方向的判断。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值