问噶问题
  • 板块灌水区
  • 楼主Alea
  • 当前回复6
  • 已保存回复6
  • 发布时间2023/7/14 13:34
  • 上次更新2023/11/3 09:55:39
查看原帖
问噶问题
322792
Alea楼主2023/7/14 13:34

这是P5486,为什么没有题解?

这是我的代码,20分求条。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int n,m,s,t,rec[110]={},ansrec[110]={};
bool cu[110][36]={};
char et;
void dfs(int d,int p,int hf){
    if(d==t){
        if(hf<ansrec[0]){
            ansrec[0]=hf;
            for(int i=s;i<=t;i++) ansrec[i]=rec[i];
        }else if(hf==ansrec[0]){
            bool flag=false;
            for(int i=s;i<=t;i++) if(ansrec[i]<rec[i]){
                flag=true;
                break;
            }
            if(!flag) for(int i=s;i<=t;i++) ansrec[i]=rec[i];
        }
    }else{
        if(cu[d+1][p]) rec[d+1]=p,dfs(d+1,p,hf);
        else if(d==t-1) dfs(d+1,p,hf);
        else for(int i=1;i<=n;i++){
            if(cu[d+1][i]&&i!=p&&hf+1<=ansrec[0]) rec[d+1]=i,dfs(d+1,i,hf+1);
        }
    }
}
int main(){
    int _=0;
    bool oouted=false;
    while(scanf("%d%d",&m,&n)==2&&(n!=0||m!=0)){
        if(oouted) puts("\n");
        ansrec[0]=0x3f3f3f;et=getchar();
        for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){
            et=getchar();
            cu[i][j]=(et=='O');
        }et=getchar();}
        scanf("%d%d",&s,&t);
        for(int i=1;i<=n;i++) if(cu[s][i]) rec[s]=i,dfs(s,i,0);
        printf("Case %d:\n\n",++_);
        if(ansrec[0]==0x3f3f3f) printf("Not available");
        else{
            int w=ansrec[s],us=s,ud=s;
            bool outed=false;
            for(int i=s;i<=t;i++){
                if(ansrec[i]!=w){
                    if(!outed) printf("%c: %d-%d",(ansrec[us]+'A'-1),us,ud+1),outed=true;
                    else printf("\n%c: %d-%d",(ansrec[us]+'A'-1),us,ud+1);
                    us=ud=i,w=ansrec[i];
                }else ud=i;
            }
        }
        memset(cu,0,sizeof cu);
        memset(rec,0,sizeof rec);
        memset(rec,0,sizeof ansrec);
        oouted=true;
    }
    return 0;
}

另外这道题为什么不开放数据???

2023/7/14 13:34
加载中...