zoukankan      html  css  js  c++  java
  • 简单深搜(poj 3009)

    题目链接:http://poj.org/problem?id=3009

    题目:冰壶撞向目的地,只有遇到“1”才能停下来,并且把“1”撞成“0”。只能横冲直撞,不允许蛇皮走位等等骚操作。从“2”要撞到“3”,周围有“0”,才能向有“0”的地方滑。运动员只能推十次,问最少要多少次才到“3”?

    用深搜遍历每一个方向。

     1 #include<stdio.h>
     2 #include<string.h>
     3 int n,m,ans,ans1; ///ans为答案,ans1为中间值
     4 int mp[26][26],dx[]={0,-1,1,0},dy[]={-1,0,0,1};///存好方向 
     5 
     6 void dfs(int x,int y)
     7 {
     8     int gx,gy;
     9     if(ans1>=ans||ans1>10) return ; ///此处进行枝剪
    10     
    11     for(int i=0;i<4;i++){ ///四个方向
    12         gx=x+dx[i],gy=y+dy[i];
    13         
    14         if(0<=gx&&n>gx&&0<=gy&&m>gy){ 
    15             if(mp[gy][gx]!=1){ ///不越界,且要走的方向第一个不为 “1”
    16                 for(;;){
    17                     if(gy<0||gy>=m||gx<0||gx>=n) ///越界
    18                         break ; 
    19                         
    20                     if(mp[gy][gx]==1){
    21                         mp[gy][gx]=0;
    22                         ans1++;
    23                         dfs(gx-dx[i],gy-dy[i]);
    24                         ans1--;
    25                         mp[gy][gx]=1;
    26                         break ;
    27                     }
    28                     
    29                     if(mp[gy][gx]==3){ ///找到“3”即可返回
    30                         if(ans>ans1)
    31                             ans=ans1;
    32                         return ;
    33                     }
    34 
    35                     gy=gy+dy[i];
    36                     gx=gx+dx[i];
    37                 }
    38             }
    39         }
    40     }
    41     return ;
    42 }
    43 
    44 int main()
    45 {
    46     while( ~scanf("%d%d",&n,&m)){
    47         if(n==0&&m==0) break;
    48         int nx,ny;
    49         for(int i=0;i<m;i++){
    50             for(int j=0;j<n;j++){
    51                 scanf("%d",&mp[i][j]);
    52                 if(mp[i][j]==2) ///找出起点的坐标
    53                     nx=j,ny=i;
    54             }
    55         }
    56         mp[ny][nx]=0;
    57         
    58         ans=1e7,ans1=1;
    59         dfs(nx,ny);
    60         if(ans>10)
    61             printf("-1
    ");
    62         else
    63             printf("%d
    ",ans);
    64     }
    65     
    66     return 0;
    67 }

    结论:遇到图,不要被问题吓到,无论如何都要动手自己做一遍。

  • 相关阅读:
    英语范文——人的名字的重要性
    英语写作常用句型
    英语范文——构建绿色校园
    OpenGL实例:三角形
    Python+Selenium笔记(二):配置谷歌+IE环境
    Python+Selenium笔记(一):环境配置+简单的例子
    Python笔记(八):web开发
    Python笔记(七):字典、类、属性、对象实例、继承
    Python笔记(六):推导数据
    Python笔记(五):异常处理和数据存储
  • 原文地址:https://www.cnblogs.com/ZQUACM-875180305/p/8603749.html
Copyright © 2011-2022 走看看