20分求助

P11228 [CSP-J 2024] 地图探险

Raymond2014 @ 2024-11-10 09:16:49

代码如下:

#include <bits/stdc++.h>
using namespace std;
int main(){
    //freopen("explore.in","r",stdin);
    //freopen("explore.out","w",stdout);
    int t;
    cin>>t;
    while(t--){
        int n,m,k,x,y,d,cnt=1;
        cin>>n>>m>>k>>x>>y>>d;
        int a[1001][1001]={},vis[1001][1001]={};
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                char c;
                cin>>c;
                if(c=='x') a[i][j]=1;
            }
        }
        for(int i=1;i<=k;i++){
            if(x<=0 || x>n || y<=0 || y>m || a[x][y]==1) d=(d+1)%4;
            if(d==0){
                if(a[x][y+1]==0 && x<=n  && x>0 && y<=m && y>0) y++;
                else d=(d+1)%4;
            }
            if(d==1){
                if(a[x+1][y]==0 && x<=n  && x>0 && y<=m && y>0) x++;
                else d=(d+1)%4;
            }
            if(d==2){
                if(a[x][y-1]==0 && x<=n  && x>0 && y<=m && y>0) y--;
                else d=(d+1)%4;
            }
            if(d==3){
                if(a[x-1][y]==0 && x<=n  && x>0 && y<=m && y>0) x--;
                else d=(d+1)%4;
            }
            if(a[x][y]==0 && x<=n  && x>0 && y<=m && y>0 && vis[x][y]==0) cnt++,vis[x][y]=1;
        }
        cout<<cnt<<endl;
    }
    return 0;
}

那位大神能帮我看一下?谢谢!


by liujiyu2013 @ 2024-11-10 11:22:04

@Raymond2014 while循环中,1~n的循环与1~k的循环的中间要加一个

vis[x][y]=1;

for循环里(1~k的循环)if语句判断d的值时需要用else if。(此时能拿60分)

剩下的40分好像cnt少了1。

我的AC Code:

#include<bits/stdc++.h>
using namespace std;
int vis[1005][1005];
char a[1005][1005];
bool check(int x,int y,int n,int m){
    return x>=1 && x<=n && y>=1 && y<=m && a[x][y]=='.';
}
int main(){
    //freopen("explore.in","r",stdin);
    //freopen("explore.out","w",stdout);
    int T;
    cin>>T;
    while(T--){
        int n,m,k;
        cin>>n>>m>>k;
        memset(vis,0,sizeof vis);
        int ans=1;
        int x,y,d;
        cin>>x>>y>>d;
        vis[x][y]=1;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                cin>>a[i][j];
            }
        }
        while(k-->0){
            int mx,my;
            if(d==0){
                my=y+1;
                mx=x;
            }
            if(d==1){
                my=y;
                mx=x+1;
            }
            if(d==2){
                my=y-1;
                mx=x;
            }
            if(d==3){
                my=y;
                mx=x-1;
            }
            if(check(mx,my,n,m)){
                x=mx;
                y=my;
                if(vis[x][y]==0)ans++;
                vis[x][y]=1;
            }
            else{
                d=(d+1)%4;
            }
        }
        cout<<ans<<"\n";
    }
    return 0;
}

by liujiyu2013 @ 2024-11-10 20:51:26

@Raymond2014 后来又看了一下,d为0,1,2,3,里的if语句要改一下: (你的代码修改)

#include <bits/stdc++.h>
using namespace std;
int a[1005][1005]={},vis[1005][1005]={};/*记得多开点,1001会RE*/
int main(){
    //freopen("explore.in","r",stdin);
    //freopen("explore.out","w",stdout);
    int t;
    cin>>t;
    while(t--){
        int n,m,k,x,y,d,cnt=1;
        cin>>n>>m>>k>>x>>y>>d;
        memset(a,0,sizeof a);
        memset(vis,0,sizeof vis);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                char c;
                cin>>c;
                if(c=='x') a[i][j]=1;
                else a[i][j]=0;
            }
        }
        vis[x][y]=1;/*改动*/
        while(k--){
            int g=d;
            if(g==0){
                if(a[x][y+1]==0 && x<=n  && x>0 && y+1/*改动*/<=m && y>0) y++;
                else d=(d+1)%4;
            }
            else if(g==1){
                if(a[x+1][y]==0 && x+1/*改动*/<=n  && x>0 && y<=m && y>0) x++;
                else d=(d+1)%4;
            }
            else if(g==2){
                if(a[x][y-1]==0 && x<=n  && x>0 && y<=m && y-1/*改动*/>0) y--;
                else d=(d+1)%4;
            }
            else if(g==3){
                if(a[x-1][y]==0 && x<=n  && x-1/*改动*/>0 && y<=m && y>0) x--;
                else d=(d+1)%4;
            }
            if(vis[x][y]==0) cnt++,vis[x][y]=1;
        }
        cout<<cnt<<endl;
    }
    return 0;
}

|