void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

现在做这些题就当水题来做了,想当初拿来别人的代码看着就费劲,唉,这东西还是熟能生巧,继续加油ac吧

题目要求,一个象棋棋牌,给出起始位置,有个马,走日子,最少走几步能走到终止位置上

简单的bfs用队列模拟,不过需要注意的是8个方向可以用一个数组来循环使用

#include <stdio.h>
#include <stdlib.h>
#include <queue>
#define N 301
using namespace std;
int  map[N][N];
bool used[N][N];
int len,stx,sty,enx,eny;
queue<int>Q;
int dir[8][2]={1,2,1,-2,-1,2,-1,-2,2,1,2,-1,-2,1,-2,-1};
int bfs()
{
    int x,y,temp;
    memset(map,-1,sizeof(map));
    memset(used,false,sizeof(used));
    while(Q.size())
    Q.pop();
    used[stx][sty]=true;
    map[stx][sty]=0;
    Q.push(stx);
    Q.push(sty);
    while(Q.size())
    {
        x=Q.front();Q.pop();
        y=Q.front();Q.pop();
        for(int i=0;i<8;i++)
        {
            int xx=x+dir[i][0];
            int yy=y+dir[i][1];
            if(!used[xx][yy]&&xx>=0&&xx<len&&yy>=0&&yy<len)
            {
                map[xx][yy]=map[x][y]+1;
                used[xx][yy]=true;
                Q.push(xx);Q.push(yy);
            }
        }
        if(used[enx][eny])break;
    }
    return map[enx][eny];
}

int main()
{
    int ca;
    scanf("%d",&ca);
    while(~scanf("%d%d%d%d%d",&len,&stx,&sty,&enx,&eny))
    printf("%d\n",bfs());
}
posted on 2011-05-09 23:39  void-man  阅读(143)  评论(0)    收藏  举报