这个欣求 , 在迷宫里密室了方向 , 走过了一个地方 不做标记 还一个劲 , 找不到媳妇不亏 .
这个题 我跳了两个坑 , 1 : 习惯性添加标记走过的 位置 ,导致所有的位置都能 走过一遍 , 2 : 转弯的时候 变换面部朝向
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<string>
#include<sstream>
#include<map>
#include<cctype>
using namespace std;
char a[105][105],T;
int b[4][2]={-1,0,0,-1,1,0,0,1},n,m,t,time1[105][105],mark/*,visited[105][105]*/; //按照 左上右下的顺序
void DFS(int x,int y,int q)
{
for(int i=0;i<4&&time1[y][x]<4&&!mark;i++) //同一个点最多前后左右四次
{
time1[y][x]++;
int ac=(i+q)%4;
if(!mark&&x+b[ac][0]>=0&&y+b[ac][1]>=0&&y+b[ac][1]<n&&x+b[ac][0]<m&&a[y+b[ac][1]][x+b[ac][0]]!='#'/*&&!visited[y+b[ac][1]][x+b[ac][0]]*/)
{
// visited[y+b[ac][1]][x+b[ac][0]]=1;
if(a[y+b[ac][1]][x+b[ac][0]]=='X')
{
mark=1;
break;
}
a[y+b[ac][1]][x+b[ac][0]]='@';
DFS(x+b[ac][0],y+b[ac][1],q);
return ; // 因为会 迷失方向 所以 一条路走到底 之后 没路走了 ( 进了死胡同 )
// visited[y+b[ac][1]][x+b[ac][0]]=0; // 就 直接去死吧 .
}
}
}
int main()
{
int x,y;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
scanf(" %c",&a[i][j]);
if(a[i][j]=='T')
{
x=j;
y=i;
}
}
}
scanf(" %c",&T);
switch(T)
{
case'N':t=0;break; // 面朝北的话 向左走
case'S':t=2;break;
case'W':t=3;break;
case'E':t=1;break;
}
memset(time1,0,sizeof(time1));
// memset(visited,0,sizeof(visited));
mark=0;
DFS(x,y,t);
if(mark)
printf("YES
");
else
printf("NO
");
}
return 0;
}