您的位置:首页 > 其它

15Knight Moves

2016-04-12 20:38 253 查看
简单题意

给出初始位置,目标位置,问骑士(国际象棋骑士)走到(国际象棋走法)终点,至少要几步

解题思路形成过程

典型广度优先搜索,和老师讲的例题差不多不过这个题有一列设置成了字母,可以用ASCLL码转换成int,不过我自己写了个map映照来转换,之后用BFS来求目标

AC代码

#include<iostream>

#include<map>

#include<queue>

#include<string.h>

#include<fstream>

using namespace std;

struct point{

    int x,y,cnt;

};

point start,finish;

int sy,ey;

bool v[9][9];

int dir[8][2]={{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2}};

int bfs();

int main()

{

    ifstream cin("in.txt");

    freopen("in.txt","r",stdin);

    map<char,int>m;

    for(int i=0;i<8;i++)m['a'+i]=i+1;//把字母转换为数字;

    char c1,c2;

    int min;

    while(cin>>c1>>sy){

        start.x=m[c1];

        start.y=sy;

        getchar();

        cin>>c2>>ey;

        finish.x=m[c2];

        finish.y=ey;

        if(start.x==finish.x&&start.y==finish.y)

        min=0;

        else min=bfs();

        printf("To get from %c%d to %c%d takes %d knight moves.\n",c1,sy,c2,ey,min);

    }

    return 0;

}

int bfs(){

    memset(v,0,sizeof(v));

    point pre,tmp;

    start.cnt=0;

    queue<point>q;

    q.push(start);

    v[start.x][start.y]=1;

    while(!q.empty()){

        pre=q.front();

        q.pop();

        if(pre.x==finish.x&&pre.y==finish.y)return pre.cnt;

        for(int i=0;i<8;i++){

            tmp.x=pre.x+dir[i][0];

            tmp.y=pre.y+dir[i][1];

            if(tmp.x<1||tmp.x>8||tmp.y<1||tmp.y>8)continue;

            if(v[tmp.x][tmp.y]==1)continue;

            v[tmp.x][tmp.y]=1;

            tmp.cnt=pre.cnt+1;

            q.push(tmp);

        }

    }

    return -1;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  广度优先搜索