90分求调

P11228 [CSP-J 2024] 地图探险

banglee @ 2024-10-29 12:47:42

#include<bits/stdc++.h>
using namespace std;
#define int long long
int T,n,m;
char a[1005][1005];
bool vis[1005][1005];
bool check(int x,int y) {
    return x>=1 && x<=n && y<=m && y>=1 && a[x][y]=='.';
}
void f(int k,int x,int y,int d) {
    int dx=x,dy=y;
    vis[x][y]=true;
    while(k--) {
        if(d==0) {
            if(check(dx,dy+1)) vis[dx][++dy]=true;
            else d=(d+1)%4;
        }
        if(d==1) {
            if(check(dx+1,dy)) vis[++dx][dy]=true;
            else d=(d+1)%4;
        }
        if(d==2) {
            if(check(dx,dy-1)) vis[dx][--dy]=true;
            else d=(d+1)%4;
        }
        if(d==3) {
            if(check(dx-1,dy)) vis[--dx][dy]=true;
            else d=(d+1)%4;
        }
    }
}
signed main() {
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    cin>>T;
    while(T--) {
        int k,x,y,d,ans=0;
        cin>>n>>m>>k>>x>>y>>d;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                cin>>a[i][j];
        memset(vis,false,sizeof(vis));
        f(k,x,y,d);
        for(int i=1;i<=1005;i++)
            for(int j=1;j<=1005;j++)
                if(vis[i][j]) ans++;
        cout<<ans<<'\n';
    }
    return 0;
}

by liangbowen @ 2024-10-29 12:48:14

你数组越界了吧


by dhlsgjr @ 2024-10-29 12:54:31

while循环有问题吧 你这有可能一次操作方向改变了多次 要么判断完之后continue要么在if前加else 数据过水


by dhlsgjr @ 2024-10-29 13:01:26

@banglee while循环的if判断改下就AC了


|