15Knight Moves

来源:互联网 发布:观音掐指准算法 编辑:程序博客网 时间:2024/06/05 07:12

简单题意

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

解题思路形成过程

典型广度优先搜索,和老师讲的例题差不多不过这个题有一列设置成了字母,可以用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;
}

0 0
原创粉丝点击