Tinkoff Challenge - Elimination Round B. Igor and his way to work(dfs+优化)

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 }

 

posted @ 2017-05-26 22:03  Kayden_Cheung  阅读(130)  评论(0编辑  收藏  举报
//目录