这是我的杭电100题,骑士遍历。。。。
#include<iostream>
#include<fstream>
#include<string>
#include<sstream>
#include<cstring>
using namespace std;
int vis[100][100],stx,sty,dex,dey,q[1000000],cnt;
int dis[100][100];
int direction[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{-1,2},{1,2},{2,1}};
void bfs(int x,int y)
{
    memset(vis,0,sizeof(vis));
    memset(dis,0,sizeof(dis));
    int front=0,rear=0,dx,dy,vx,vy;
    int u=x*8+y,v;
    q[rear++]=u;
    vis[x][y]=1;
    while(front<rear)
    {

        v=q[front++];
        vx=v/8,vy=v%8;
        if(vx<0||vy<0||vx>=8||vy>=8) continue;
        for(int i=0;i<8;i++)
        {
            dx=vx+direction[i][0];
            dy=vy+direction[i][1];
            if(dx>=0&&dy>=0&&dx<8&&dy<8&&!vis[dx][dy])
            {
                vis[dx][dy]=1;
                q[rear++]=dx*8+dy;
                dis[dx][dy]=dis[vx][vy]+1;
                if(dx==dex&&dy==dey) break;
            }
        }

    }
}
int main()
{
    //ifstream cin("a.txt");
    string s1,s2;
    while(cin>>s1>>s2)
    {
        char x1,y1,x2,y2;
        istringstream ss1(s1);
        istringstream ss2(s2);
        ss1>>x1>>y1;ss2>>x2>>y2;
        stx=x1-'a';sty=y1-'0'-1;
        dex=x2-'a';dey=y2-'0'-1;
        cnt=0;
        bfs(stx,sty);
        cout<<"To get from "<<s1<<" to "<<s2<<" takes "<<dis[dex][dey]<<" knight moves.\n";
    }
    return 0;
}
posted on 2012-02-14 15:45  fakeAcmer  阅读(173)  评论(0编辑  收藏  举报