30pts求条

P11228 [CSP-J 2024] 地图探险

VelvetChords @ 2024-10-28 13:47:15

#include<bits/stdc++.h>
using namespace std;
int T,n,m,k,x,y,d;
char a[1005][1005];
bool f[1005][1005];
int main(){
    cin>>T;
    while(T--)
    {
        cin>>n>>m>>k>>x>>y>>d;
        long long ans=0;
        memset(f,0,sizeof f);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                cin>>a[i][j];
        for(int i=1;i<=k;i++)
        {
            f[x][y]=1;
            if(d==0)
            {
                if(a[x][y+1]=='.') y++; 
                else if(a[x+1][y]=='.') d=1;
                else if(a[x][y-1]=='.') d=2;
                else if(a[x-1][y]=='.') d=3;
            }
            else if(d==1)
            {   
                if(a[x+1][y]=='.') x++;
                else if(a[x][y-1]=='.') d=2;
                else if(a[x-1][y]=='.') d=3;
                else if(a[x][y+1]=='.') d=0; 
            }
            else if(d==2)
            {
                if(a[x][y-1]=='.') y--;
                else if(a[x-1][y]=='.') d=3;
                else if(a[x][y+1]=='.') d=0; 
                else if(a[x+1][y]=='.') d=1;
            }
            else if(d==3)
            {   
                if(a[x-1][y]=='.') x--;
                else if(a[x][y+1]=='.') d=0; 
                else if(a[x+1][y]=='.') d=1;
                else if(a[x][y-1]=='.') d=2;
            }
        }
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                if(f[i][j]==1) ans++;
        cout<<ans<<endl;
    }
    return 0;
}

by PeacefulStagnation @ 2024-10-28 13:53:30

评价: ①这种做法是错的。 ②因为: 1、代码if过于杂乱,建议用函数。 2、先判断能不能走再标记(注意,先把起点标记了) ③综上所述,我们写代码时应该认识到代码可读性的重要性,这样有利于我们AC/AKCSP。


by PeacefulStagnation @ 2024-10-28 13:53:51

评价: ①这种做法是错的。

②因为: 1、代码if过于杂乱,建议用函数。 2、先判断能不能走再标记(注意,先把起点标记了)

③综上所述,我们写代码时应该认识到代码可读性的重要性,这样有利于我们AC/AKCSP。


by VelvetChords @ 2024-10-28 13:57:25

//仍然30分
#include<bits/stdc++.h>
using namespace std;
int T,n,m,k,x,y,d;
char a[1005][1005];
bool f[1005][1005];
int main(){
    cin>>T;
    while(T--)
    {
        cin>>n>>m>>k>>x>>y>>d;
        long long ans=0;
        memset(f,0,sizeof f);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                cin>>a[i][j];
        f[1][1]=1;
        for(int i=1;i<=k;i++)
        {       
            if(d==0)
            {
                if(a[x][y+1]=='.')
                {
                    y++; 
                    f[x][y]=1;
                } 
                else if(a[x+1][y]=='.') d=1;
                else if(a[x][y-1]=='.') d=2;
                else if(a[x-1][y]=='.') d=3;
            }
            else if(d==1)
            {   
                if(a[x+1][y]=='.')
                {
                    x++; 
                    f[x][y]=1;
                } 
                else if(a[x][y-1]=='.') d=2;
                else if(a[x-1][y]=='.') d=3;
                else if(a[x][y+1]=='.') d=0; 
            }
            else if(d==2)
            {
                if(a[x][y-1]=='.')
                {
                    y--; 
                    f[x][y]=1;
                } 
                else if(a[x-1][y]=='.') d=3;
                else if(a[x][y+1]=='.') d=0; 
                else if(a[x+1][y]=='.') d=1;
            }
            else if(d==3)
            {   
                if(a[x-1][y]=='.')
                {
                    x--;
                    f[x][y]=1;
                } 
                else if(a[x][y+1]=='.') d=0; 
                else if(a[x+1][y]=='.') d=1;
                else if(a[x][y-1]=='.') d=2;
            }
        }
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                if(f[i][j]==1) ans++;
        cout<<ans<<endl;
    }
    return 0;
}

by PeacefulStagnation @ 2024-10-28 14:00:25

自定义函数呢?!


by VelvetChords @ 2024-10-28 14:01:02

为什么要用呀?

不想用呢》


by PeacefulStagnation @ 2024-10-28 14:01:31

不想用就别想对(


by VelvetChords @ 2024-10-28 14:02:00

调不调


by tangchenhui @ 2024-10-28 14:26:04

问题出在右转应该不算在步数内。

所以如果 a[x'][y'] 不是能走的点的话,应该用 while 循环转向。


by tangchenhui @ 2024-10-28 14:31:38

噢,对不起,题目看错了


by tangchenhui @ 2024-10-28 14:52:11

额,一共有三个错误

1.初始化时没有清空 a 数组,样例测不出来是因为样例的 T 组数据中 n,m 都是递增的,但是如果数据中有 n,m 是递减的,由于你的程序判断是否在地图内的方式是判断 a_{x,y} 是否为 .,所以前一组较大的 n,m 可能会对后面有影响,所以 a 数组要清空。

2.由于初始节点要标记,终止节点也要标记,所以你在退出循环后没有标记更新后的 (x,y)

3.题目要求转向一次就,所以转向的部分错了,如果 a_{x',y'} 不符合条件的话应该只转向一次,所以直接 d=(d+1)%4 就行了

代码放在下面,但建议自己写一遍。

#include<bits/stdc++.h>
using namespace std;
int T,n,m,k,x,y,d;
char a[1005][1005];
bool f[1005][1005];
int main(){

    cin>>T;
    while(T--)
    {
        cin>>n>>m>>k>>x>>y>>d;
        long long ans=0;
        memset(a,0,sizeof(a));
        memset(f,0,sizeof(f));
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                cin>>a[i][j];
        for(int i=1;i<=k;i++)
        {
            f[x][y]=1;
            if(d==0)
            {
                if(a[x][y+1]=='.') y++; 
                else d=1;
            }
            else if(d==1)
            {   
                if(a[x+1][y]=='.') x++;
                else d=2;
            }
            else if(d==2)
            {
                if(a[x][y-1]=='.') y--;
                else d=3;
            }
            else if(d==3)
            {   
                if(a[x-1][y]=='.') x--;
                else d=0;
            }
        }
        f[x][y]=1;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                if(f[i][j]==1) ans++;
        cout<<ans<<endl;
    }
    return 0;
}

| 下一页