70分求助

P11228 [CSP-J 2024] 地图探险

happy_banana @ 2024-11-14 20:37:36

#include<bits/stdc++.h>
using namespace std;
int T,n,m,k,stx,sty,stf,sum;
int a[10010][10010];
bool pd[10010][10010],flag;
void dfs(int x,int y,int d,int s)
{
    if(s>k) return;
    if(d==0) 
    {
        if(a[x][y+1]==1&&y+1<=m) 
        {
            if(pd[x][y+1]==0)
            {
                pd[x][y+1]=1;
                sum++;
            }
            dfs(x,y+1,d,s+1);
        }
        else dfs(x,y,(d+1)%4,s+1);
    }
    else if(d==1) 
    {
        if(a[x+1][y]==1&&x+1<=n) 
        {
            if(pd[x+1][y]==0)
            {
                pd[x+1][y]=1;
                sum++;
            }
            dfs(x+1,y,d,s+1);
        }
        else dfs(x,y,(d+1)%4,s+1);
    }   
    else if(d==2) 
    {
        if(a[x][y-1]==1&&y-1>=0) 
        {
            if(pd[x][y-1]==0)
            {
                pd[x][y-1]=1;
                sum++;
            }
            dfs(x,y-1,d,s+1);
        }
        else dfs(x,y,(d+1)%4,s+1);
    }
    else 
    {
        if(a[x-1][y]==1&&x-1>=0) 
        {
            if(pd[x-1][y]==0)
            {
                pd[x-1][y]=1;
                sum++;
            }
            dfs(x-1,y,d,s+1);
        }
        else dfs(x,y,(d+1)%4,s+1);
    }
}
int main()
{
    string s;
    cin>>T;
    for(int C=1;C<=T;C++)
    {
        sum=1;
        memset(pd,0,sizeof(pd));
        cin>>n>>m>>k;
        cin>>stx>>sty>>stf;
        stx--;
        sty--;
        for(int i=0;i<n;i++)
        {
            cin>>s;
            for(int j=0;j<m;j++)
            {
                if(s[j]=='.') a[i][j]=1;
                else a[i][j]=0;
            }
        }
        pd[stx][sty]=1;
        dfs(stx,sty,stf,1); 
        cout<<sum<<'\n';
    }
    return 0;
}

by mooktian @ 2024-11-15 16:28:19

@happy_banana

1.你要开一个方向数组来记录方向啊,

2.初始位置,你没有标记

加一个:

pd[stx][sty] = 1;

3.没必要用dfs啊,整的太复杂了,你这个代码。


by mooktian @ 2024-11-15 16:36:48

不好意思,看错了,你那个初始位置有标记了。

没看出哪有问题,你这个代码实在是太长了。

贴一个AC代码,仅供参考。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1010;
int t,n,m,k;
int dx[4] = {0,1,0,-1},dy[4] = {1,0,-1,0};
char a[N][N];
bool st[N][N];
int main( ) {
cin >> t;
while(t--) {
    int ans = 1;
    int x,y,d;
    memset(st,0,sizeof st);
    cin >> n >> m >> k >> x >> y >> d;
    st[x][y] = 1;
    for(int i = 1;i <= n;i++)
        for(int j = 1;j <= m;j++) 
            cin >> a[i][j];
    while(k--) {
        int nx = x + dx[d] , ny = y + dy[d];
        if(nx >= 1 && nx <= n && ny >= 1 && ny <= m && a[nx][ny] != 'x') {
            if(!st[nx][ny]) {
                st[nx][ny] = 1;
                ans ++;
            }
            x = nx , y = ny;
        }else d = (d + 1) % 4; 
    }
    cout << ans <<"\n";
    }
return 0;
}

by wangmuze @ 2024-11-16 18:57:35

Jhaja+3920/33


by happy_banana @ 2024-11-17 08:58:28

@mooktian 感谢


by happy_banana @ 2024-11-17 08:59:10

谁能帮我看看我这个代码?

九九孩子啊


|