社区讨论
为什么取模的时候一定要+n或+m?
P1363幻象迷宫参与者 8已保存回复 14
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 14 条
- 当前快照
- 1 份
- 快照标识符
- @mi85w8fg
- 此快照首次捕获于
- 2025/11/21 09:08 4 个月前
- 此快照最后确认于
- 2025/11/21 09:45 4 个月前
因为我实在是太弱,不得不看了一下题解
还是有不懂的,为什么dfs函数里的这一行
int tx=(x+dx[dir]-1+n)%n+1,ty=(y+dy[dir]-1+m)%m+1,tmx=mx+dx[dir],tmy=my+dy[dir];在取模的时候一定要+n,+m呢?(不加就WA了)求解orz
CPP#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
#define MAX 1510
int n,m,a[MAX][MAX]={0},vis[MAX][MAX][3]={0},sx,sy;
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
int flag=0;
void dfs(int x,int y,int mx,int my){
if(vis[x][y][0]&&(vis[x][y][1]!=mx||vis[x][y][2]!=my)){
flag=1;
return;
}
else{
vis[x][y][0]=1;vis[x][y][1]=mx;vis[x][y][2]=my;
for(int dir=0;dir<4;dir++){
int tx=(x+dx[dir]-1+n)%n+1,ty=(y+dy[dir]-1+m)%m+1,tmx=mx+dx[dir],tmy=my+dy[dir];
if(a[tx][ty]&&(!vis[tx][ty][0]||(vis[tx][ty][1]!=tmx||vis[tx][ty][2]!=tmy))){
dfs(tx,ty,tmx,tmy);
}
if(flag)return;
}
}
}
int main(){
ios::sync_with_stdio(false);
char temp;
while(cin>>n>>m){
flag=0;
memset(vis,0,sizeof(vis));
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>temp;
if(temp=='.')a[i][j]=1;
if(temp=='S'){
a[i][j]=1;
sx=i;sy=j;
}
}
}
dfs(sx,sy,sx,sy);
if(flag)puts("Yes");
else puts("No");
}
return 0;
}
回复
共 14 条回复,欢迎继续交流。
正在加载回复...