萌新这道题调崩了/kk
查看原帖
萌新这道题调崩了/kk
203008
YamadaRyou楼主2021/3/27 18:05

蒟蒻自认为这个思路没问题,而且用这个思路应该是可以过样例的,但写出来的就是错,帮帮蒟蒻吧/kk

#include<cstdio>
#include<cstring>
int a[1010][1010];
int score[1010][1010][4];
bool vis[1010][1010];
const int dx[4]={1,-1,-1,1},dy[4]={1,1,-1,-1};
int n;
int dfs(int x,int y,int d) {
    if(vis[x][y])
        return 0;
    if(~score[x][y][d])
        return score[x][y][d];
    if((x==1||x==n)&&(y==1||y==n)&&(x+dx[d]<1||x+dx[d]>n||y+dy[d]<1||y+dy[d]>n))
        return a[x][y];
    if((x==1||x==n)||(y==1||y==n)&&(x+dx[d]<1||x+dx[d]>n||y+dy[d]<1||y+dy[d]>n))
        d=(d==3?0:d+1);
    vis[x][y]=true;
    int ans=a[x][y]+dfs(x+dx[d],y+dy[d],d);
    vis[x][y]=false;
    return score[x][y][d]=ans;
}
void _dfs(int x,int y,int d) {
    if(vis[x][y])
        return ;
    a[x][y]=0;
    if((x==1||x==n)&&(y==1||y==n)&&(x+dx[d]<1||x+dx[d]>n||y+dy[d]<1||y+dy[d]>n)) 
        return ;
    if(((x==1||x==n)||(y==1||y==n))&&(x+dx[d]<1||x+dx[d]>n||y+dy[d]<1||y+dy[d]>n))
        d=(d==3?0:d+1);
    vis[x][y]=true;
    _dfs(x+dx[d],y+dy[d],d);
    vis[x][y]=false;
}
int query() {
    std::memset(score,-1,sizeof(score));
    int x,y,d,s=-1,_s,ans=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++) 
            for(int k=0;k<4;k++) {
                _s=dfs(i,j,k);
                if(_s>s) {
                    s=_s;
                    x=i;
                    y=j;
                    d=k;
                }
            }
//    std::printf("%d %d %d %d\n",x,y,d,s);
    ans=s;
    _dfs(x,y,d);
    std::memset(score,-1,sizeof(score));
    s=-1;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++) 
            for(int k=0;k<4;k++) {
                _s=dfs(i,j,k);
                if(_s>s) {
                    s=_s;
                    x=i;
                    y=j;
                    d=k;
                }
            }
//    std::printf("%d %d %d %d\n",x,y,d,s);
    ans+=s;
    return ans;
}
int main() {
    std::scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++) 
            std::scanf("%d",&a[i][j]);
    std::printf("%d",query());
    return 0;
}
2021/3/27 18:05
加载中...