【求助】考场上样例全过,在家打出错了,大体是这样,dfs有问题

P11228 [CSP-J 2024] 地图探险

Dannylxy2012 @ 2024-10-26 18:05:12

考场上样例全过,在家打出错了,大体是这样,dfs有问题,没超

#include<bits/stdc++.h>
using namespace std;
int n,m,k,t;
char a[1005][1005];
int fx[5]={0,1,0,-1};
int fy[5]={1,0,-1,0};
void dfs(int x,int y,int d,int p,int tu){
    a[x][y]='@';
    if(p==k||tu==4){
        return ;
    }
    int tx=x+fx[d];
    int ty=y+fy[d];
    if(a[tx][ty]=='.') dfs(tx,ty,d,p+1,0);
    else if(a[tx][ty]=='@') dfs(tx,ty,d,p+1,0);
    else dfs(x,y,(d+1)%4,p,tu+1);
}
int main(){
    cin>>t;
    for(int i=1;i<=t;i++){
        cin>>n>>m>>k;
        int x,y,d;
        cin>>x>>y>>d;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                cin>>a[i][j];
            }
        }
        dfs(x,y,d,0,0);
        int sum=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(a[i][j]=='@'){
                    sum++; 
                }
            }
        }
        cout<<sum<<endl;
    }
    return 0;
}

by T7_C24_JSD_78 @ 2024-10-26 18:12:00

我在考场上模拟的; 为什要用dfs? 其实这道题就是大模拟


by HFZ20111110 @ 2024-10-26 18:12:13

@Dannylxy2012 我是用模拟,好像没必要dfs


by xu_duo @ 2024-10-26 18:14:18

这道题是模拟啊。。。

考场上第一眼dfs,第二眼dp,第三眼模拟(悲


by T7_C24_JSD_78 @ 2024-10-26 18:24:28

@Dannylxy2012

#include<bits/stdc++.h>
using namespace std;
char a[1005][1005];
int n,m,t,k,kkk,b[1005][1005],e,c[4][4],x,y,d;
int main() {
    cin>>t;
    c[0][1]=0,c[0][2]=1;
    c[1][1]=1,c[1][2]=0;
    c[2][1]=0,c[2][2]=-1;
    c[3][1]=-1,c[3][2]=0;
    while(t--){
        cin>>n>>m>>k>>x>>y>>d;
        kkk=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                cin>>a[i][j];b[i][j]=0;
            }
        }
        b[x][y]++;
        for(int i=1;i<=k;i++){
            x+=c[d][1],y+=c[d][2];
            if(x>n  or  y>m or  x<1 or y<1  or  a[x][y]=='x'){
                x-=c[d][1],y-=c[d][2];
                d=(d+1)%4;
            }
            else b[x][y]++;
        }
         for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(b[i][j]!=0) kkk++;
            }
        }
        cout<<kkk<<endl;
    }
    return 0;
}

这是我打的模拟,虽然难看,但是好歹A了


by Dannylxy2012 @ 2024-10-26 18:33:55

谢谢,请问我的code还有救吗?0-0


by Cloke0 @ 2024-10-26 18:34:28

暴力也能满分

#include<bits/stdc++.h>
using namespace std;
int T,n,m,k,x,y,d;
int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%d%d%d",&n,&m,&k);
        getchar();
        scanf("%d%d%d",&x,&y,&d);
        char c[n+1][m+1];
        int v[n+1][m+1]={},ans=0;
        for(int i=1;i<=n;i++){
            scanf("%s",&c[i]);
        }
        v[x][--y]=1;
        while(k--){
            int nx,ny;
            if(d==0){nx=x,ny=y+1;}
            if(d==1){nx=x+1,ny=y;}
            if(d==2){nx=x,ny=y-1;}
            if(d==3){nx=x-1,ny=y;}
            if(c[nx][ny]=='x'||nx<1||nx>n||ny<0||ny>=m){
                d=(d+1)%4;
            }
            else{
                x=nx,y=ny;
                v[x][y]=1;
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=0;j<m;j++){
                if(v[i][j])ans++;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

by Zhangneng @ 2024-10-26 19:06:05

我们老师跟我说这题是广度优先搜索?!!


by Zhangneng @ 2024-10-26 19:10:29

@Cloke0 你这个不就是模拟吗


by guimei121212 @ 2024-10-26 19:24:40

@xu_duo 可惜第3题DP我没时间思考了了(第一题写半天才发现我没写读入。。。)


|