(其实我不知道算原创还是转载)
题目大意:
现有一个无限大的迷宫,是由无限个n*m的相同矩阵单位组成的,迷宫中有路和墙。给出这个矩阵单位和起点,问能不能走到离起点无穷远的地方。
这题题目还是看懂了,但是提交了不下20次才AC,还看了两个大佬的题解
不愧是蓝题
一开始用了BFS,然后WA,看题解发现好多大佬都用DFS,于是就改了,结果AC+WA+TLE+MLE+RE。。。。。。
最后顺便学到了一个新颖的判重方法!
最终的AC代码:
#include<iostream>
#include<cstring>
using namespace std;
int n,m,fx,fy;
bool valid[1515][1515],flag; //valid[x][y]表示(x,y)这个方格能不能通过(节约空间)
int vis[1515][1515][3]; //vis[x][y][0]表示上一个映射到(x,y)的点的x坐标,vix[x][y][1]表示y坐标,vis[x][y][2]若为-1表示没有被映射到过,1表示有
const int d[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; //控制方向
void dfs(int x,int y,int mapx,int mapy){
if(vis[mapx][mapy][2]!=-1){
if(vis[mapx][mapy][0]!=x || vis[mapx][mapy][1]!=y) flag=true; //如果这个点与上一个映射到同一个点的点不是同一个,那么是可以无限走下去的(按从上一个点走的这一个点的方式走到下一个点)
return; //否则属于重复搜索
}
vis[mapx][mapy][0]=x;
vis[mapx][mapy][1]=y;
vis[mapx][mapy][2]=1; //记录
int tox,toy;
for(int i=0;i<4 i++){
tox=((mapx+d[i][0])%n+n)%n;toy=((mapy+d[i][1])%m+m)%m;"
if(valid[tox][toy]) dfs(x+d[i][0],y+d[i][1],tox,toy);
if(flag) return; //剪枝(吗?)可以走到就不必继续搜了(当时没加这一句就TLE+MLE)
}
}
int main(){
int i,j;
char ch;
while(cin>>n>>m){
fx=fy=-1;
memset(valid,0,sizeof(valid));
memset(vis,-1,sizeof(vis)); //初始化
for(i=0;i<n;i++)
for(j=0;j<m;j++){
if(ch=='S'){
fx=i;fy=j;
valid[i][j]=true;
}
if(ch=='.') valid[i][j]=true; //设置可不可以走
}
flag=false;
dfs(fx,fy,fx,fy);
if(flag) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}