poj 2243 Knight Moves

//这题和1915是一样的题目,只不过这题的输入需要进行转换,还有这题没有给出具体的棋盘和棋子的
//走法,如果对国际象棋不熟悉的人来讲,是很难读得明白题意的,棋盘和棋子的走法可以参照1915题! 
#include <iostream>
#include <string>
#include <map> 
using namespace std;
const int MAX = 15; 
map<char, int> m; 
string input1, input2;
int l, r, sx, sy, ex, ey, dir[8][2] = {{-2, -1}, {-2, 1}, {-1, -2}, {-1, 2}, {1, -2}, {2, -1}, {2, 1}, {1, 2}}; 
bool vis[MAX][MAX];
 
//结构体储存一个点的坐标和到达这个点的步数! 
struct Info{
       int x, y;
       int step; 
}info[MAX*MAX]; 

//进行宽搜,得出另一个符合要求的坐标点,储存入数组,然后再一一进行搜索! 
void solve(int x, int y)
{
     if (x >= 0 && x < 8 && y >= 0 && y < 8 && !vis[x][y]){ 
         info[r].x = x;
         info[r].y = y;
         info[r].step = info[l].step + 1;
         vis[x][y] = 1; 
         r++; 
     } 
} 


void bfs()
{
     int i, tmpx, tmpy; 
     info[0].x = sx;
     info[0].y = sy;
     vis[sx][sy] = 1; 
     l = 0;//以一个链表的形式进行搜索结果的储存! 
     r = 1;
     while (l != r){
           if (info[l].x == ex && info[l].y == ey){
               //printf("To get from %s to %s takes %d knight moves.\n", input1, input2, info[l].step);
               cout << "To get from " << input1 << " to " << input2 << " takes " << info[l].step << " knight moves." << endl; 
               break; 
           } 
           //八个方向的坐标转换,再一一进行宽搜! 
           for (i = 0; i < 8; i++){
               tmpx = info[l].x + dir[i][0];
               tmpy = info[l].y + dir[i][1];
               solve(tmpx, tmpy); 
           } 
           l++; 
     } 
     return ; 
} 



int main()
{
    m['a'] = 1, m['b'] = 2, m['c'] = 3, m['d'] = 4, 
    m['e'] = 5, m['f'] = 6, m['g'] = 7, m['h'] = 8; 
    while (cin >> input1 >> input2){
          //对输入进行字符串和数字之间的转换! 
          sx = m[input1[0]] - 1;
          sy = input1[1] - 48 - 1;
          ex = m[input2[0]] - 1;
          ey = input2[1] - 48 - 1; 
          memset(vis, 0, sizeof(vis)); 
          bfs(); 
    } 
    
    system("pause"); 
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值