2021.08.16 P1363 幻象迷宫(dfs,我感受到了出题人浓浓的恶意)

P1363 幻象迷宫 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题意:

幻象迷宫可以认为是无限大的,不过它由若干个N*M的矩阵重复组成。矩阵中有的地方是道路,用'.'表示;有的地方是墙,用'#'表示。LHX和WD所在的位置用'S'表示。也就是对于迷宫中的一个点(x,y),如果(x mod n,y mod m)是'.'或者'S',那么这个地方是道路;如果(x mod n,y mod m)是'#',那么这个地方是墙。LHX和WD可以向上下左右四个方向移动,当然不能移动到墙上。

请你告诉LHX和WD,它们能否走出幻象迷宫(如果它们能走到距离起点无限远处,就认为能走出去)。如果不能的话,LHX就只好启动城堡的毁灭程序了……当然不到万不得已,他不想这么做。。。

分析:

只要有一个点可以被重复走两遍,就是Yes。

代码如下:

第一次不知所云的代码(肯定0分,鬼知道我写的是啥)

#include<bits/stdc++.h>
using namespace std;
char ch;
int n,m,mapi[1505][1505],num[1505][1505],numi[5],tot;//上,下,左,右 
int x[5]={0,0,0,-1,1},y[5]={0,1,-1,0,0};
void prin(){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cout<<num[i][j];
		}
		cout<<endl;
	}
	cout<<endl;
}
void dfs(int startx,int starty){
	for(int i=1;i<=4;i++){
		for(int j=1;j<=4;j++){
			int flagx=0,flagy=0;
			int a=startx+x[i],b=starty+y[j];
			if(a>n)a-=n,++numi[2],flagx=2;
			if(a<1)a+=n,++numi[1],flagx=1;
			if(b>m)b-=m,++numi[4],flagy=4;
			if(b<1)b+=m,++numi[3],flagy=3;
			if(mapi[a][b]!=0){
				++num[a][b];
				if(num[a][b]==2){
					//cout<<"      3"<<endl;//
					//cout<<numi[1]<<" "<<numi[2]<<" "<<numi[3]<<" "<<numi[4]<<endl;//
					if(((numi[1]%2==1&&numi[1]!=0)||numi[1]==0)&&
						((numi[2]%2==1&&numi[2]!=0)||numi[2]==0)&&
						((numi[3]%2==1&&numi[3]!=0)||numi[3]==0)&&
						((numi[4]%2==1&&numi[4]!=0)||numi[4]==0)){
						cout<<"YES"<<endl;
					}else{
						cout<<"NO"<<endl; 
					}
					return ;
				}else{
					dfs(a,b);
					--num[a][b];
				}
			}else{
				--numi[flagx];
				--numi[flagy];
			}
		}
	} 
}
int main(){
	while(cin>>n>>m){
		int startx,starty;
		memset(numi,0,sizeof(numi));
		memset(mapi,0,sizeof(mapi));
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				cin>>ch;
				if(ch!='#')mapi[i][j]=1;
				if(ch=='S')startx=i,starty=j;
			}
		}
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++)cout<<mapi[i][j]<<" ";
			cout<<endl;
		}
		cout<<endl;
		dfs(startx,starty);
	}
	return 0;
}

第二次90分的代码,第五个测试点倒数第二组数据简直狠毒

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

const int N=1510;
int n,m,map[N][N],startx,starty,vis[N][N],visx[N][N],visy[N][N];
int flag,disx[5]={0,0,0,1,-1},disy[5]={0,1,-1,0,0};
char ch;

inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}

void dfs(int x,int y,int numx,int numy){
	if(flag)return ;
	if(vis[x][y]&&(visx[x][y]!=numx||visy[x][y]!=numy)){
		//cout<<x<<" "<<y<<" "<<numx<<" "<<numy<<endl;
		flag=1;
		return ;
	}
	vis[x][y]=1;visx[x][y]=numx;visy[x][y]=numy;
	for(int i=1;i<=4;i++){
		int xi=(x+disx[i]+n)%n,yi=(y+disy[i]+m)%m;
		int xii=numx+disx[i],yii=numy+disy[i];
		if(!map[xi][yi]&&(!vis[xi][yi]||visx[xi][yi]!=xii||visy[xi][yi]!=yii))
			dfs(xi,yi,xii,yii);
	}
}

int main(){
	while(~scanf("%d%d",&n,&m)){
		flag=0;
		memset(vis,0,sizeof(vis));
		memset(map,0,sizeof(map));
		memset(visx,0,sizeof(visx));
		memset(visy,0,sizeof(visy));
		//bool add=0;
		ch=getchar();ch=getchar();
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				ch=getchar();
				cin>>ch;
				/*if(ch==' '&&!add){
					add=1;
				}
				if(ch==' '&&add&&j==m-1)ch=getchar(),j=0,ch=getchar();*/
				if(ch=='#')map[i][j]=1;
				if(ch=='S')startx=i,starty=j;
			}
			ch=getchar();ch=getchar();
		}
		/*for(int i=0;i<n;i++){
			for(int j=0;j<m;j++)cout<<map[i][j]<<" ";
			cout<<endl;
		}
		cout<<endl;*/
		dfs(startx,starty,startx,starty);
		/*for(int i=0;i<n;i++){
			for(int j=0;j<m;j++)cout<<vis[i][j]<<" ";
			cout<<endl;
		}
		cout<<endl;*/
		if(flag)cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
	}
	return 0;
}

/*
16 10
##.......#
########.#
........#S
#######..#
.......#..
######..##
......#...
#####..###
.....#....
####..####
....#.....

###..#####
...#......
##..######
..#.......
#..#######

No
*/

第三次满分代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

const int N=1510;
int n,m,map[N][N],startx,starty,vis[N][N],visx[N][N],visy[N][N];
int flag,disx[5]={0,0,0,1,-1},disy[5]={0,1,-1,0,0};
char ch;

inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}

void dfs(int x,int y,int numx,int numy){
	if(flag)return ;
	if(vis[x][y]&&(visx[x][y]!=numx||visy[x][y]!=numy)){
		//cout<<x<<" "<<y<<" "<<numx<<" "<<numy<<endl;
		flag=1;
		return ;
	}
	vis[x][y]=1;visx[x][y]=numx;visy[x][y]=numy;
	for(int i=1;i<=4;i++){
		int xi=(x+disx[i]+n)%n,yi=(y+disy[i]+m)%m;
		int xii=numx+disx[i],yii=numy+disy[i];
		if(!map[xi][yi]&&(!vis[xi][yi]||visx[xi][yi]!=xii||visy[xi][yi]!=yii))
			dfs(xi,yi,xii,yii);
	}
}

int main(){
	while(~scanf("%d%d",&n,&m)){
		flag=0;
		memset(vis,0,sizeof(vis));
		memset(map,0,sizeof(map));
		memset(visx,0,sizeof(visx));
		memset(visy,0,sizeof(visy));
		//bool add=0;
		ch=getchar();//ch=getchar();
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				//ch=getchar();
				cin>>ch;
				/*if(ch==' '&&!add){
					add=1;
				}
				if(ch==' '&&add&&j==m-1)ch=getchar(),j=0,ch=getchar();*/
				if(ch=='#')map[i][j]=1;
				if(ch=='S')startx=i,starty=j;
			}
			//ch=getchar();//ch=getchar();
		}
		/*for(int i=0;i<n;i++){
			for(int j=0;j<m;j++)cout<<map[i][j]<<" ";
			cout<<endl;
		}
		cout<<endl;*/
		dfs(startx,starty,startx,starty);
		/*for(int i=0;i<n;i++){
			for(int j=0;j<m;j++)cout<<vis[i][j]<<" ";
			cout<<endl;
		}
		cout<<endl;*/
		if(flag)cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
	}
	return 0;
}

/*
16 10
##.......#
########.#
........#S
#######..#
.......#..
######..##
......#...
#####..###
.....#....
####..####
....#.....

###..#####
...#......
##..######
..#.......
#..#######

No
*/
 posted on 2021-08-16 10:16  eleveni  阅读(66)  评论(0)    收藏  举报