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
*/

2021.08.16 P1363 幻象迷宫(dfs,我感受到了出题人浓浓的恶意)的更多相关文章

  1. 2021.08.16 P1300 城市街道交通费系统(dfs)

    2021.08.16 P1300 城市街道交通费系统(dfs) P1300 城市街道交通费系统 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 城市街道交费系统最近创立了.一 ...

  2. 2021.08.16 P1260 工程规划(差分约束)

    2021.08.16 P1260 工程规划(差分约束) 重点: 1.跑最短路是为了满足更多约束条件. P1260 工程规划 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 造 ...

  3. 2021.08.16 P1078 文化之旅(最短路)

    2021.08.16 P1078 文化之旅(最短路) 题意: n个地,k个信仰,每个地都有自己的信仰,信仰之间会相互排斥,同信仰之间也会相互排斥,有m条路,问从s到t的最短距离是多少? 有一位使者要游 ...

  4. P1363 幻象迷宫[搜索]

    题目描述 (喵星人LHX和WD同心协力击退了汪星人的入侵,不幸的是,汪星人撤退之前给它们制造了一片幻象迷宫.) WD:呜呜,肿么办啊-- LHX:momo...我们一定能走出去的! WD:嗯,+U+U ...

  5. 洛谷1363 幻象迷宫dfs

    题目网址:https://www.luogu.com.cn/problem/P1363 迷宫是无限多块地图拼接而成的,问是否可以在迷宫中走无限远.解决方案是dfs,走出初始地图之后的位置映射到原位置( ...

  6. 【洛谷】【搜索(dfs)】P1363 幻想迷宫

    [题目描述:] 幻象迷宫可以认为是无限大的,不过它由若干个N*M的矩阵重复组成.矩阵中有的地方是道路,用'.'表示:有的地方是墙,用'#'表示.LHX和WD所在的位置用'S'表示.也就是对于迷宫中的一 ...

  7. 【洛谷P1363】幻象迷宫

    P1363 幻想迷宫 显然,若从原图中起点走到相邻的图中对应的"起点"位置 ,就可以无限走下去, 若一个点从原图中可以到达,到了非原图中也可以到达,就可以无限走下去 我们不妨记录下 ...

  8. 洛谷 P1363 幻想迷宫 解题报告

    P1363 幻想迷宫 题目描述 背景 Background (喵星人LHX和WD同心协力击退了汪星人的入侵,不幸的是,汪星人撤退之前给它们制造了一片幻象迷宫.) WD:呜呜,肿么办啊-- LHX:mo ...

  9. 络谷 P1363 幻想迷宫

    P1363 幻想迷宫 题目描述 背景 Background (喵星人LHX和WD同心协力击退了汪星人的入侵,不幸的是,汪星人撤退之前给它们制造了一片幻象迷宫.) WD:呜呜,肿么办啊…… LHX:mo ...

随机推荐

  1. QT designer的安装与汉化(pycharm)

    QT designer的安装 1.安装好Python3的环境 添加环境变量,保证安装正确, 2.安装PyQt5 采用命令安装,Win+R,输入CMD,打开命令框,输入以下命令.后面是豆瓣的镜像地址,是 ...

  2. onGUI常用脚本学习(引用)

    https://blog.csdn.net/Hannah1221/article/details/101941174?spm=1001.2101.3001.6650.3&utm_medium= ...

  3. Intellij IDEA实现SpringBoot项目多端口启动的两种方法

    有时候使用springboot项目时遇到这样一种情况,用一个项目需要复制很多遍进行测试,除了端口号不同以外,没有任何不同.遇到这种情况怎么办呢?这时候可以使用Intellij IDEA解决 前言 有时 ...

  4. XML文档约束有哪几种?有什么区别?

    XML DTD(功能有限) XML Schema (功能强大) Schema本身是XML的,可以被XML解析器解析(这也是从DTD上发展schema的根本目的),Schema支持命名空间,Schema ...

  5. Mybatis 动态 sql 有什么用?执行原理?有哪些动态 sql?

    Mybatis 动态 sql 可以在 Xml 映射文件内,以标签的形式编写动态 sql,执行原理 是根据表达式的值 完成逻辑判断并动态拼接 sql 的功能. Mybatis 提供了 9 种动态 sql ...

  6. ruoyi首次使用常见问题的解决方案

    1.导入项目之后,下载依赖包之后,模块的依赖项飘红(我这里无法复现,当参考图吧) 解决方法: 2.ruoyi框架代码生成之后,需要自己进行替换到指定位置.相应的官方文档位置,否则,可能会出现404,访 ...

  7. zookeeper 负载均衡和 nginx 负载均衡区别?

    zk 的负载均衡是可以调控,nginx 只是能调权重,其他需要可控的都需要自己写插件:但是 nginx 的吞吐量比 zk 大很多,应该说按业务选择用哪种方式.

  8. mybatis 和 hibernate 本质区别和应用场景

    Hibernate: 是一个标准 ORM 框架(对象关系映射).入门门槛较高,不需要程序员写 SQL,SQL语句自动生成. 对 SQL 语句进行优化.修改比较困难. 应用场景: 适用于需求变化不多的中 ...

  9. python办公自动化系列之金蝶K3(三)

    小爬在之前的两篇文章 [python办公自动化系列之金蝶K3自动登录(一)].[python办公自动化系列之金蝶K3自动登录(二)]带大家系统搞定了K3客户端的自动登录难题,但是搞定[自动登录]只是我 ...

  10. cpu指令如何读写硬盘

    我们提到cpu的主要作用之一就是控制设备之间的数据交互.这其中自然也包括了硬盘.系统的所有数据基本都在硬盘中,所以知道怎么读写硬盘,对程序来说非常重要,所以我们先来探索下传说中的pio模式. cpu要 ...