zoukankan      html  css  js  c++  java
  • poj3009 Curling 2.0 深搜

    PS:以前看到题目这么长就没写下去了。今天做了半天,没做出来。准备看题解,打开了网站都忍住了,最后还是靠自己做出来的。算是一点进步吧。

    分析:

      题目的意思没明白或者理解有偏差都没办法做题。看样例3和样例4,数据差不多的,但是一个输出4,但是另外的一个却是-1。再去看题目就会发现,题目的意思是在撞碎石头之前必须走一个为值0的格子。我理解为需要加速。对样例4,答案4是这样出来的:初始位置为(1,3),第一步是到达(1,2),并且使得(1,1)点的值为0(撞碎了这里的石头,0代表可以通行);第二步是到达(1,3),并且是得(1,4)点的值为0;第三步是到达(1,4),并且使得(1,5)的值为0;第四步是到达(1,5),发现到达了终点,结束。样例5也可以这样得到。

      样例6错误的原因是因为超过了10步,这是题目的要求,超过10步就当不能到达处理。

      这样一来,可以知道了起点和终点的处理了。起点(终点)的坐标记录下来,但是标记为0。

      还有就是实现如何对一个方向进行搜索,以及如何标记在撞石头之前已经走过0的位置(不能是这种情况:起点是0,下一点就撞石头)。这思考一下就可以实现了。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 
     7 void DFS(int x,int y,int di);
     8 const int N=22,INF=0x3f3f3f3f;
     9 bool vis[N][N];
    10 int r,c,t,ex,ey,sx,sy,mx;
    11 int dx[4]={0,0,1,-1};
    12 int dy[4]={1,-1,0,0};
    13 bool isin(int x,int y)
    14 {
    15     return x>=0&&x<r&&y>=0&&y<c;
    16 }
    17 void DDFS(int a,int b,int x,int y,int d)
    18 {
    19     int i,j;
    20     if(t>10) return ;
    21     i=x+a; j=y+b;
    22     if(!isin(i,j)) return ;
    23     if(!vis[i][j])
    24     {
    25         d=1;
    26         if(i==ex&&j==ey)
    27         {
    28             mx=min(t,mx);
    29         }
    30         DDFS(a,b,i,j,d);
    31     }
    32     else if(vis[i][j]&&d)
    33     {
    34         vis[i][j]=0;
    35         d=0;
    36         t++;
    37         DFS(x,y,d);
    38         t--;
    39         vis[i][j]=1;
    40     }
    41 }
    42 void DFS(int x,int y,int d)
    43 {
    44 
    45     for(int k=0;k<4;k++)
    46     {
    47         DDFS(dx[k],dy[k],x,y,d);
    48     }
    49 }
    50 int main()
    51 {
    52     //freopen("test.txt","r",stdin);
    53     while(scanf("%d%d",&c,&r)!=EOF&&c)
    54     {
    55         int x;
    56         for(int i=0;i<r;i++){
    57             for(int j=0;j<c;j++){
    58                 scanf("%d",&x);
    59                 if(x==3)
    60                 {
    61                     ex=i;ey=j;
    62                     vis[i][j]=0;
    63                 }
    64                 else if(x==2)
    65                 {
    66                     sx=i;sy=j;
    67                     vis[i][j]=0;
    68                 }
    69                 else vis[i][j]=x;
    70             }
    71         }
    72         t=1;
    73         mx=INF;
    74         DFS(sx,sy,0);
    75         if(mx==INF) printf("-1
    ");
    76         else printf("%d
    ",mx);
    77     }
    78     return 0;
    79 }
    View Code

      DFS(x,y,d) : (x,y)是起点的坐标,d是标记是否有经过被标记0的点。1表示经过了,0表示没有。

      DDFS(a,b,x,y,d) :(a,b)是方向向量,表明向什么方向搜索;x,y,d同上。

      通过d的记录就可以知道石头可不可以撞碎。使用(a,b)就可以沿着同一方向一直深入。

  • 相关阅读:
    【LeetCode每天一题】Rotate List(旋转链表)
    【LeetCode每天一题】Permutation Sequence(排列序列)
    【LeetCode每天一题】Length of Last Word(字符串中最后一个单词的长度)
    【LeetCode每天一题】Merge Intervals(合并区间)
    【LeetCode每天一题】Spiral Matrix II(螺旋数组II)
    Ajax基础
    git的命令行操作
    新闻发布系统之登录和注销
    JSTL和EL
    servlet模板的修改
  • 原文地址:https://www.cnblogs.com/Potato-lover/p/4114002.html
Copyright © 2011-2022 走看看