• Tinkoff Challenge


    http://codeforces.com/contest/793/problem/B

    题意:
    一个地图,有起点和终点还有障碍点,求从起点出发到达终点,经过的路径上转弯次数是否能不超过2。

    思路:

    直接dfs,但是要优化一下,用vis[x][y][dir]来记录在(x,y)并且方向为dir时的最少转弯数,这样在dfs的时候可以剪掉一些不符合的情况。

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<cstdio>
     5 #include<vector>
     6 #include<stack>
     7 #include<queue>
     8 #include<cmath>
     9 #include<map>
    10 using namespace std;
    11 typedef long long LL;
    12 const int inf=0x3f3f3f3f;
    13 const int maxn=1000+5;
    14 
    15 int n,m;
    16 int sx,sy;
    17 int flag;
    18 char g[maxn][maxn];
    19 int vis[maxn][maxn][5];
    20 
    21 int dx[]={0,0,1,-1};
    22 int dy[]={1,-1,0,0};
    23 
    24 void dfs(int x,int y,int dir,int turn)
    25 {
    26     if(flag)    return;
    27     if(turn>2)  return;
    28     if(vis[x][y][dir]<=turn)  return;  //优化
    29     if(g[x][y]=='T')
    30     {
    31         if(turn<=2)  flag=1;
    32         return;
    33     }
    34     vis[x][y][dir]=turn;
    35     for(int k=0;k<4;k++)
    36     {
    37         int xx=x+dx[k];
    38         int yy=y+dy[k];
    39         if(g[xx][yy]=='*')  continue;
    40         if(xx<0||x>=n||yy<0||yy>=m)  continue;
    41         if(k!=dir)  dfs(xx,yy,k,turn+1);
    42         else dfs(xx,yy,k,turn);
    43     }
    44 }
    45 
    46 int main()
    47 {
    48     //freopen("D:\input.txt","r",stdin);
    49     while(~scanf("%d%d",&n,&m))
    50     {
    51         int ff=0;
    52         for(int i=0;i<n;i++)
    53         {
    54            scanf("%s",g[i]);
    55            if(!ff)
    56            for(int j=0;j<m;j++)
    57                if(g[i][j]=='S')  {sx=i;sy=j;ff=1;}
    58         }
    59         flag=0;
    60         memset(vis,inf,sizeof(vis));
    61         for(int k=0;k<4;k++)
    62         {
    63             int x=sx+dx[k];
    64             int y=sy+dy[k];
    65             if(x<0||x>=n||y<0||y>=m)  continue;
    66             if(g[x][y]!='*')  dfs(x,y,k,0);
    67         }
    68         if(flag)  puts("YES");
    69         else puts("NO");
    70     }
    71     return 0;
    72 }
  • 相关阅读:
    ajax基本使用
    ajax
    七个你无法忽视的Git使用技巧
    Git原始笔记
    php session自定义处理
    linux下用phpize给PHP动态添加扩展
    【转】做到这一点,你也可以成为优秀的程序员
    PHP扩展开发-测验成功
    PHP扩展开发--实验成功
    php类似shell脚本的用法
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/6910637.html
Copyright © 2020-2023  润新知