• 贪吃蛇


    题目:

    http://oj.changjun.com.cn/problem/detail/pid/2185

    Description

    身长为L的贪吃蛇在一个有障碍的N*M的格子中游走,问最少用多少步才能让贪吃蛇的蛇头到达(1,1)。

    Input

    第一行三个正整数 N, M,L。L表示贪吃蛇的长度。
    接下来 L 行,顺序描述贪吃蛇每节身体的位置。每行两个正整数 X,Y。 表示某节身体的位置,按蛇头到蛇尾的顺序描述。
    接下来一个正整数K。 表示有 K个障碍,每个障碍占一个格子。
    接下来K行, 每行两个正整数 X,Y, 表示某个障碍的位置。

    Output

    一个整数,表示到达格子(1,1)最少的步数。(给定数据保证能够到达,并且蛇头移动的目标格子必须是空的。)

    Sample Input

    5 6 4
    4 1
    4 2
    3 2
    3 1
    3
    2 3
    3 3
    3 4

    Sample Output

    9

    Hint

    对于 100% 的数据,2≤N、M≤20,2≤L≤8

    解析:

    可以广搜,但状态懒得存,干脆写个迭代加深搜索,代码简洁好写。

    可是迭代深搜复杂度还是比较高的,我们考虑IDA*。

    先预处理出每个点到终点的距离,记为dis[x][y]。

    记当前层数为now,迭代层数为deep。

    当dis[x][y]+now>deep时,则return;因为怎么都不可能在deep-now步之内走到终点。

     1 #include<set>
     2 #include<map>
     3 #include<queue>
     4 #include<stack>
     5 #include<ctime>
     6 #include<cmath>
     7 #include<string>
     8 #include<vector>
     9 #include<cstdio>
    10 #include<cstdlib>
    11 #include<cstring>
    12 #include<iostream>
    13 #include<algorithm>
    14 using namespace std;
    15 int n,m;
    16 int q1[1000],q2[1000],head=1,tail=0;
    17 int mp[25][25],fb[25][25],w[5]={0,1,-1,0,0},u[5]={0,0,0,1,-1};
    18 int vis[25][25],dis[25][25];
    19 int ww[5]={0,0,0,1,-1},uu[5]={0,1,-1,0,0};
    20 void DFS(int deep,int now)
    21 {
    22   int xx=q1[tail],yy=q2[tail];
    23   if(now+dis[xx][yy]>deep) return;//IDA*
    24   if(now==deep){
    25     if(xx==1 && yy==1) printf("%d",deep),exit(0);
    26     else return;
    27   }
    28   for(int i=1;i<=4;i++)
    29     {
    30       int x=xx+w[i],y=yy+u[i];
    31       if(x>0 && x<=n && y>0 && y<=m && !mp[x][y]){
    32     mp[x][y]=1;
    33     q1[++tail]=x,q2[tail]=y;
    34     int kx=q1[head],ky=q2[head];
    35     mp[kx][ky]=0;head++;
    36     DFS(deep,now+1);
    37     mp[kx][ky]=1;
    38     mp[x][y]=0;
    39     head--;tail--;
    40       }
    41     }
    42 }
    43 void BFS()
    44 {
    45   queue<int>q1,q2;
    46   q1.push(1),q2.push(1);
    47   vis[1][1]=1;
    48   while(!q1.empty()){
    49     int xx=q1.front(),yy=q2.front();
    50     q1.pop();q2.pop();
    51     for(int i=1;i<=4;i++)
    52       {
    53     int x=xx+ww[i],y=yy+uu[i];
    54     if(x>0 && x<=n && y>0 && y<=n && !fb[x][y] && !vis[x][y])
    55       dis[x][y]=dis[xx][yy]+1,q1.push(x),q2.push(y),vis[x][y]=1;
    56       }
    57   }
    58 }
    59 int main()
    60 {
    61   freopen("snake.in","r",stdin);
    62   freopen("snake.out","w",stdout);
    63   int L,x,y,k;
    64   scanf("%d%d%d",&n,&m,&L);
    65   for(int i=1;i<=L;i++){
    66     scanf("%d%d",&x,&y);
    67     q1[L-i+1]=x;q2[L-i+1]=y;
    68     mp[x][y]=1;
    69   }
    70   scanf("%d",&k);
    71   for(int i=1;i<=k;i++)
    72     scanf("%d%d",&x,&y),mp[x][y]=1,fb[x][y]=1;
    73   BFS();
    74   for(int i=0;i<=n;i++)
    75     for(int j=0;j<=m;j++)
    76       fb[i][j]=mp[i][j];
    77   for(int i=0;;i++)
    78     {
    79       head=1;tail=L;
    80       DFS(i,0);
    81       for(int j=0;j<=n;j++)
    82     for(int ij=0;ij<=m;ij++)
    83       mp[j][ij]=fb[j][ij];
    84     }
    85 }
  • 相关阅读:
    PostgreSQL数据库逻辑复制实践
    CentOS7通过yum安装postgreSQL
    MongoDB动态建表方案(官方原生驱动)
    7大常用开源数据库利弊全对比
    错误:由于系统时间错误证书验证失败导致更新不成功
    deppin更新提示“由于没有公钥,无法验证下列签名”
    Debian 9 Vim无法使用鼠标右键复制 解决方法
    PHP版滑动时间窗口算法
    RabbitMQ PHP 代码示例
    创建或修改 docker 容器内部文件
  • 原文地址:https://www.cnblogs.com/pantakill/p/6535907.html
Copyright © 2020-2023  润新知