洛谷 1363【幻想迷宫】

(其实我不知道算原创还是转载)

题目大意:

现有一个无限大的迷宫,是由无限个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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值