• POJ 1915


    这一题主要用到了BFS广度优先算法 若马的当前位置为(x,y),那么下一步就有8种可能。

    (x+2 , y+1) , (x+1 , y+2 ) , (x-1 , y+2) , (x-2 , y+1)

    (x+2 , y -1) , (x+1 ,  y-2 ) , (x-1 , y-2) , (x-2 , y-1)

    这8种可能一个一个地去尝试,尝试过的用visit二维数组标记(小心数组越界),直到找到为止。

    #include <iostream>
    #include <string.h>
    using namespace std;
    struct Node{
    public:
        int x,y,d;
    };
    Node n[90010];                        //可以用queue函数去做
    int visit[310][310];
    int step[8][2]={{-1,-2},{-1,2},{1,-2},{1,2},{-2,-1},{-2,1},{2,-1},{2,1}};
    int bfs(Node source,Node target,int l){
        int i=0,j=0,d=0,nx,ny,x,y;
        memset(visit,0,sizeof(visit));
        n[0].x=source.x;
        n[0].y=source.y;
        n[0].d=source.d=0;
        visit[source.x][source.y]=1;
        while(j<=i){
            x=n[j].x;
            y=n[j].y;
            d=n[j].d+1;
            j++;
            for(int k=0;k<8;k++){
                nx=x+step[k][0];
                ny=y+step[k][1];
                if(nx<0||ny<0||nx>l-1||ny>l-1)continue;          //注意题目要求为0~L-1
                if(visit[nx][ny])continue;
                if(nx==target.x&&ny==target.y)return d;
                i++;
                n[i].x=nx;
                n[i].y=ny;
                n[i].d=d;
                visit[nx][ny]=1;
            }
        }
        return 0;
    }
    int main()
    {   int t,l;
        cin>>t;
        Node source,target;
        while(t--){
            cin>>l>>source.x>>source.y>>target.x>>target.y;
            if(source.x==target.x&&source.y==target.y)cout<<"0"<<endl;
            else cout<<bfs(source,target,l)<<endl;
        }
        return 0;
    }

  • 相关阅读:
    Anaconda(4.8.3)(Anaconda3-2020.02-Windows-x86_64)安装日志和启动问题排查日志
    abp学习日志九(总结)
    abp学习日志八(多租户)
    abp学习日志六(模块化开发)
    abp学习日志七(动态API)
    abp学习日志五(领域服务)
    abp学习日志四(仓储)
    ug主菜单men文件按书写格式,这样写有利单个dll调用
    NX开发,blockUI窗口调用blockUI窗口
    VS2013快捷键大全
  • 原文地址:https://www.cnblogs.com/Mr-Xu-JH/p/3842868.html
Copyright © 2020-2023  润新知