• COJ1046(追杀)


    Description

    在一个89列的国际象棋棋盘上,有一名骑士在追杀对方的国王。该骑士每秒跨越一个2*3的区域,如下图所示。

     

     

    而对方的国王慌忙落逃,他先沿着右下斜线方向一直跑,遇到边界以后会沿着光线反射方向继续跑(遇到死角则原路返回),他每秒只跑一格。

    给出骑士和国王的初始位置,求最快在多少秒的时候骑士能追杀掉对方的国王。骑士和国王每一秒都必须要有行动,而不能原地等待。

    Input

    有多组测试数据。对于每组测试数据,输入只有一行:nx,ny,kx,ky,前2个表示骑士的初始坐标,后2个表示国王的初始坐标,以左上角的格子为(0,0),向右为x轴正方向,向下为y轴正方向。(0<=nx,kx<=8,0<=ny,ky<=7)

    Output

        对于每组测试数据,仅输出一个整数,即骑士追杀到国王的最快时刻。初始位置的时刻为0。追杀到的时刻是指骑士和国王处在同一格的时刻。

    Sample Input

    0 7 0 0
    

    Sample Output

    3

    这是典型的BFS题,状态可设计为骑士的位置,国王的位置,国王当前的逃跑方向,关键在于状态的转换,国王当前的位置和方向可由上一个位置和方向确定,关于反射和原路返回的处理,我是直接模拟的,一开始反射理解错了,比如在(2,7)往右下移动,应该反射为(3,6),我理解成了(3,7),所以WA了一次。
    View Code
      1 #include <stdio.h>
      2 #include <queue>
      3 #define N 10
      4 using namespace std; 
      5 int dx[8]={1,-1,-2,-2,-1,1,2,2};
      6 int dy[8]={2,2,1,-1,-2,-2,-1,1};
      7 int dkx[4]={1,-1,-1,1};
      8 int dky[4]={-1,-1,1,1};
      9 typedef struct node
     10 {
     11   int nx,ny,kx,ky;
     12   int d;
     13 }node;
     14 node cur,next;
     15 queue<node> Q;
     16 int nx,ny,kx,ky;
     17 int t[N][N][N][N][4];
     18 node tran(node tmp,int k)
     19 {
     20   int x1,x2,y1,y2,d;
     21   int nx1,nx2,ny1,ny2,nd;
     22   x1=tmp.nx;
     23   y1=tmp.ny;
     24   x2=tmp.kx;
     25   y2=tmp.ky;
     26   d=tmp.d;
     27   nx1=x1+dx[k];
     28   ny1=y1+dy[k];
     29   if(nx1<0 || ny1<0 || nx1>8 || ny1>7)
     30   {
     31     tmp.d=-1;
     32     return tmp;
     33   }
     34   if(x2==0 && y2==0 && d==1)
     35   {
     36     nx2=1;
     37     ny2=1;
     38     nd=3;
     39   }
     40   else if(x2==8 && y2==0 && d==0)
     41   {
     42     nx2=7;
     43     ny2=1;
     44     nd=2;
     45   }
     46   else if(x2==0 && y2==7 && d==2)
     47   {
     48     nx2=1;
     49     ny2=6;
     50     nd=0;
     51   }
     52   else if(x2==8 && y2==7 && d==3)
     53   {
     54     nx2=7;
     55     ny2=6;
     56     nd=1;
     57   }
     58   else if(x2==0 && (d==1 || d==2) )
     59   {
     60     nx2=1;
     61     if(d==1)
     62     {
     63       ny2=y2-1;
     64       nd=0;
     65     }
     66     else
     67     {
     68       ny2=y2+1;
     69       nd=3;
     70     }
     71   }
     72   else if(x2==8 && (d==0 || d==3) )
     73   {
     74     nx2=7;
     75     if(d==0)
     76     {
     77       ny2=y2-1;
     78       nd=1;
     79     }
     80     else
     81     {
     82       ny2=y2+1;
     83       nd=2;
     84     }
     85   }
     86   else if(y2==0 && (d==0 || d==1) )
     87   {
     88     ny2=1;
     89     if(d==0)
     90     {
     91       nx2=x2+1;
     92       nd=3;
     93     }
     94     else
     95     {
     96       nx2=x2-1;
     97       nd=2;
     98     }
     99   }
    100   else if(y2==7 && (d==2 || d==3) )
    101   {
    102     ny2=6;
    103     if(d==2)
    104     {
    105       nx2=x2-1;
    106       nd=1;
    107     }
    108     else
    109     {
    110       nx2=x2+1;
    111       nd=0;
    112     }
    113   }
    114   else
    115   {
    116     nx2=x2+dkx[d];
    117     ny2=y2+dky[d];
    118     nd=d;
    119   }
    120   if(t[nx1][ny1][nx2][ny2][nd]>=0)
    121   {
    122     tmp.d=-1;
    123     return tmp;
    124   }
    125   t[nx1][ny1][nx2][ny2][nd]=t[x1][y1][x2][y2][d]+1;
    126   tmp.nx=nx1;
    127   tmp.ny=ny1;
    128   tmp.kx=nx2;
    129   tmp.ky=ny2;
    130   tmp.d=nd;
    131   return tmp;
    132 }
    133 void bfs()
    134 {
    135   bool success=false;
    136   int x1,x2,y1,y2,d,ans;
    137   while(!Q.empty()) Q.pop();
    138   memset(t,0xff,sizeof(t));
    139   t[nx][ny][kx][ky][3]=0;
    140   cur.nx=nx;
    141   cur.ny=ny;
    142   cur.kx=kx;
    143   cur.ky=ky;
    144   cur.d=3;
    145   Q.push(cur);
    146   while(!success && !Q.empty())
    147   {
    148     cur=Q.front(),Q.pop();
    149     x1=cur.nx;
    150     y1=cur.ny;
    151     x2=cur.kx;
    152     y2=cur.ky;
    153     d=cur.d;
    154     if(x1==x2 && y1==y2)
    155     {
    156       success=true;
    157       ans=t[x1][y1][x2][y2][d];
    158     }
    159     for(int i=0;i<8 && !success;i++)
    160     {
    161       next=tran(cur,i);
    162       if(next.d>=0)  Q.push(next);
    163     }
    164   }
    165   printf("%d\n",ans);
    166 }
    167 int main()
    168 {
    169   while(~scanf("%d%d%d%d",&nx,&ny,&kx,&ky)) bfs();
    170   return 0;
    171 }
  • 相关阅读:
    Vue生态圈之----vue-router----路由配置
    Vue生态圈之----vue-router----基础实例
    Webpack学习整理之----最简单的实例
    Webpack学习整理之----配置
    Webpack学习整理之----概念
    多个系统域名使用同一认证中心做单点登录的做法
    JavaScript基础概念之----Commonjs、CMD、AMD、UMD
    npm 镜像及使用
    nvm 指令
    mongodb安装配置启动踩的坑
  • 原文地址:https://www.cnblogs.com/algorithms/p/2575216.html
Copyright © 2020-2023  润新知