Codeforces 793B Igor and his way to work 题解

来源:互联网 发布:orange pi淘宝 编辑:程序博客网 时间:2024/06/05 09:37

题意

给定一个n*m的地图,’S’为起点,’T’为终点,’.’为空地,’*’为路障,问是否存在一条从起点到终点拐弯次数不超过2的路

思路

记忆化搜索,记录4维数据,包括行、列、拐弯次数、方向

代码

#include <cstdio>#include <iostream>using namespace std;char mp[1001][1001];int x1,y1,x2,y2;int f,n,m;int vis[1001][1001][3][5];void dfs(int x,int y,int turn,int d){    if(x<0||x>=n||y<0||y>=m||turn>2||vis[x][y][turn][d]==1||mp[x][y]=='*'||f==1)        return;    vis[x][y][turn][d]=1;    if(x==x2&&y==y2)    {        f=1;        return;    }    if(d==0||d==1)        dfs(x-1,y,turn,1);    else if(d==3||d==4)        dfs(x-1,y,turn+1,1);    if(d==0||d==2)        dfs(x+1,y,turn,2);    else if(d==3||d==4)        dfs(x+1,y,turn+1,2);    if(d==0||d==3)        dfs(x,y-1,turn,3);    else if(d==1||d==2)        dfs(x,y-1,turn+1,3);    if(d==0||d==4)        dfs(x,y+1,turn,4);    else if(d==1||d==2)        dfs(x,y+1,turn+1,4);}int main(){    cin>>n>>m;    for(int i=0;i<n;i++)        cin>>mp[i];    for(int i=0;i<n;i++)        for(int j=0;j<m;j++)            if(mp[i][j]=='S')            {                x1=i;                y1=j;            }            else if(mp[i][j]=='T')            {                x2=i;                y2=j;            }    dfs(x1,y1,0,0);    if(f==1)        printf("YES\n");    else printf("NO\n");    return 0;}
0 0
原创粉丝点击