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