50分

P11228 [CSP-J 2024] 地图探险

wanglovezl @ 2024-11-20 16:43:11

#include<bits/stdc++.h>
using namespace std;
int Map[1005][1005];
int kmap[1005][1005];
int T;
char kmp;
int n,m,k;
int x,y,d;
int ans;
bool check(int x,int y){
    if(x>n||x<1||y>m||y<1) return false;
    else if(Map[x][y]==1) return false;
    return true;
}
void dfs(int x,int y,int d,int cnt,int cna){
    if(cna==k) return;
    int nx,ny;
    if(d==0){
        nx=x,ny=y+1;
        if(check(nx,ny)==true){
            if(kmap[nx][ny]==0) ans++;
            kmap[nx][ny]=1;
            dfs(nx,ny,d,0,++cna);
        }
        else if(check(nx,ny)==false){
            d=(d+1)%4;
            dfs(x,y,d,++cnt,++cna);
        }
    }
    else if(d==1){
        nx=x+1,ny=y;
        if(check(nx,ny)==true){
            if(kmap[nx][ny]==0) ans++;
            kmap[nx][ny]=1;
            dfs(nx,ny,d,0,++cna);
        }
        else if(check(nx,ny)==false){
            d=(d+1)%4;
            dfs(x,y,d,++cnt,++cna);
        }
    }
    else if(d==2){ 
        nx=x,ny=y-1;
        if(check(nx,ny)==true){
            if(kmap[nx][ny]==0) ans++;
            kmap[nx][ny]=1;
            dfs(nx,ny,d,0,++cna);
        }
        else if(check(nx,ny)==false){
            d=(d+1)%4;
            dfs(x,y,d,++cnt,++cna);
        }
    }
    else if(d==3){
        nx=x-1,ny=y;
        if(check(nx,ny)==true){
            if(kmap[nx][ny]==0) ans++;
            kmap[nx][ny]=1;
            dfs(nx,ny,d,0,++cna);
        }
        else if(check(nx,ny)==false){
            d=(d+1)%4;
            dfs(x,y,d,++cnt,++cna);
        }
    }
    return;
}
int main(){
    scanf("%d",&T);
    while(T--){
        ans=1;
        memset(Map,0,sizeof(Map));
        memset(kmap,0,sizeof(kmap));
        cin>>n>>m>>k;
        cin>>x>>y>>d;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                cin>>kmp;
                if(kmp=='.'){
                    Map[i][j]=0;
                }
                else if(kmp=='x'){
                    Map[i][j]=1;
                }
            }
        }
        dfs(x,y,d,0,0);
        printf("%d\n",ans);
    }
    return 0;
}

by zzzz1234567 @ 2024-11-20 16:51:11

起点的kmap要设成1,不然你的起点可能对答案造成两次贡献


by schlutz @ 2024-11-21 18:32:15

直接暴力就行啥都没多做(我考场上就这么做的100分)


by wanglovezl @ 2024-11-25 14:32:32

@zzzz1234567 谢谢


|