zoukankan      html  css  js  c++  java
  • uva 439 Knight Moves

    很简单的骑士周游问题,简单的BFS

    一个骑士在当前位置的话可以像8个方向走,至于骑士是怎么走的可以百度一下

    记录起点和终点的行列并算出它的标号(整个棋盘是8*8的,按行优先去编号从1到64,所以每个格子都会有一个唯一的编号)

    走了8个方向记录下每个方向的编号,每得到一个编号就判断和终点编号是否相同,是的话就已经走到了,跳出,否则的话这个格子入队

    另外就是记录步数,就是代码中的k

    另外要注意判断起点和终点相同的情况,都是输出0

    #include <stdio.h>
    #include <string.h>
    #include <queue>
    #define MAX 70
    using namespace std;
    bool vis[70];
    int START,END;
    char s[10];
    struct node
    {int num,r,c,k;};
    queue<struct node> q;
    
    void BFS()
    {
        int i,k,R[9],C[9];
        struct node tmp;
    
        while(!q.empty()) q.pop();
        tmp.num=START; tmp.k=0;
        tmp.r = ((START%8)==0) ? (START/8) : (START/8+1) ;
        tmp.c = ((START%8)==0) ? 8 : START%8 ;
        q.push(tmp);   //初始化把起点入队
        if(tmp.num==END) q.pop();
        while(!q.empty())  //这个判断可以省去
        {
            tmp=q.front(); q.pop(); //出队一个元素
            k=tmp.k;
            R[1]=tmp.r-2;  C[1]=tmp.c-1;   
            R[2]=tmp.r-2;  C[2]=tmp.c+1;
            R[3]=tmp.r-1;  C[3]=tmp.c+2;
            R[4]=tmp.r+1;  C[4]=tmp.c+2;
            R[5]=tmp.r+2;  C[5]=tmp.c+1;
            R[6]=tmp.r+2;  C[6]=tmp.c-1;
            R[7]=tmp.r+1;  C[7]=tmp.c-2;
            R[8]=tmp.r-1;  C[8]=tmp.c-2;
    
            for(i=1; i<=8; i++)
            {
                if(R[i]>=1 && R[i]<=8 && C[i]>=1 && C[i]<=8)
                {
                    tmp.r=R[i]; tmp.c=C[i]; tmp.k=k+1;
                    tmp.num=(tmp.r-1)*8+tmp.c;
                    q.push(tmp);   //入队
                    if(tmp.num==END)  break;
                }
            }
    
            if(i<=8)  break;
    
        }
        printf("To get from %c%c to %c%c takes %d knight moves.\n",s[0],s[1],s[3],s[4],tmp.k);
    
        return ;
    
    }
    int main()
    {
        int r,c;
        while(gets(s))
        {
            c=s[0]-'a'+1;  r=s[1]-'0';
            START=8*(r-1)+c;
            c=s[3]-'a'+1;  r=s[4]-'0';
            END=8*(r-1)+c;
    
            BFS();
        }
        return 0;
    }
  • 相关阅读:
    Spring浅谈
    struts浅谈
    Tomcat启动发生的那些事儿
    sizeof的用法
    栈应用之括号匹配
    条件编译
    MySQL数据库常用命令
    快速排序
    分页查询的那些坑和各种技巧
    国外程序员收集整理的 PHP 资源大全
  • 原文地址:https://www.cnblogs.com/scau20110726/p/2736617.html
Copyright © 2011-2022 走看看