poj 2243 bfs(还是骑士移动)

这道题跟 1915 是一样的,通过这道题主要学习了 从字符串中分离出字母和数字的方法。
#include<iostream>
#include<string>
using namespace std;
#define max 10
int dir[8][2]={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}};
int vis[max][max],step[max][max],sx,sy,ex,ey;
int xx[100],yy[100];
void bfs(int i,int j)
{
     int front,rear,k,x,y;
     front=0;rear=0;
     vis[i][j]=1;
     step[i][j]=0;
     xx[rear]=i;
     yy[rear++]=j;
     while(rear>front)
     {
        i=xx[front];
        j=yy[front++];              
       for(k=0;k<8;k++)
       {             
                     x=i+dir[k][0];
                     y=j+dir[k][1];
                     if(!vis[x][y]&&x>0&&x<=8&&y>0&&y<=8)//注意不要踏出棋盘 
                     {
                         vis[x][y]=1;
                         step[x][y]=step[i][j]+1;
                         xx[rear]=x;
                         yy[rear++]=y;
                         //把点 入队列 
                         //printf("%d%d ",x,y);                                 
                     }
       }
     }
}
int main()
{
    string s1,s2;//从字符串中分离出字母和数字,注意技巧 
    while(cin>>s1>>s2)
    {
      memset(vis,0,sizeof(vis));
      memset(step,0,sizeof(step));
      sx=s1[0]-'a'+1; 
      sy=s1[1]-'0';
      ex=s2[0]-'a'+1;
      ey=s2[1]-'0';
       //printf("%d%d%d%d",sx,sy,ex,ey);
       //system("pause");
      if(sx==ex&&sy==ey)
      {cout<<"To get from "<<s1<<" to "<<s2<<" takes 0 knight moves."<<endl;
      continue;}
      else
      { 
      bfs(sx,sy);
cout<<"To get from "<<s1<<" to "<<s2<<" takes "<<step[ex][ey]<<" knight moves."<<endl;
      }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值