为什么取模的时候一定要+n或+m?

回复帖子

@Dark_Van 2019-06-30 21:29 回复

因为我实在是太弱,不得不看了一下题解

还是有不懂的,为什么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

#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;
}
@AquaRio  2019-06-30 21:36 回复 举报

@Dark_Van 您可以下一组数据 然后分别cout一下tx ty取模后的结果 看一看会不会蹦出负数之类的来

@AquaRio  2019-07-01 16:55 回复 举报

@Dark_Van 这就是基本操作啦
学长还告诉过我一个骚操作 就是cout<<"fuck"<<endl 命名曰fuck检查法

反馈
如果你认为某个帖子有问题,欢迎向洛谷反馈,以帮助更多的同学。



请具体说明理由,以增加反馈的可信度。