itfhuv 2022-08-04 11:59 采纳率: 60%
浏览 71

一道dfs,自己想的,解不出来

主要问题是输入之后回车,迟迟没有结果,疑似卡进循环里了。


内存限制:50MB
时间限制:5.00s
题目背景:
炎炎夏日,旅行者、菲谢尔、枫原万叶和辛焱一行人来到金苹果群岛度假,探索辽阔无垠、美丽丰饶的海岛。菲谢尔从鉴亭书院杨源一博士处得知,只要找到16个海螺,就能获得风度翩翩华冠丽服鹑衣百结的永夜断罪新衣装。菲谢尔十分喜欢这套衣装,委托旅行者帮忙寻找海螺。但是旅行者肩负调查愚人众营地的任务,必须尽快找到海螺。旅行者身体虚弱,无法下水,只能在陆地上行进。
抽象化题意:
在一个n行m列的平面内,有x个海螺每一个整数点可表示为(i,j),i∈[1,n],j∈[1,m]。以0标志海岛中可行进的陆地,1表示不能行进的海域(map[1][1]!=1),9表示海螺。输入一张地图,角色从地图左上角出发,输出最少步数(地图中1个单位向量为1步)

1<=x<=16
4<=n,m<=114
由于旅行者脑容量有限,内存限制为50Mib,又因为它很忙,时间限制5.00s。

int map[115][115],n,m;//地图和地图大小 
int target_x[17],target_y[17];//海螺横纵坐标 
int dt_x[4]={0,1,0,-1};
int dt_y[4]={1,0,-1,0};//顺时针试探 
int v[115][115],vv[17];//v:标志是否走过 vv:海螺是否被排列 
int minn=114*114,temp_min=114*114;//sum=0;//sum:最短步数 
int turn[17];//访问海螺的顺序,tunr【0】=0,从起点开始,用于控制target数组 
void dfs(int x,int y,int x1,int y1,int step){
    int x2,y2;//下一步新起点坐标 
    if(x==x1&&y==y1){
        if(step<minn)minn=step;
        return;
    }
    else{
        for(int i=0;i<4;i++){
            if(v[x+dt_x[i]][y+dt_y[i]]==0&&map[x+dt_x[i]][y+dt_y[i]]==0){//走的过程中比当前最小值大了,return 
                x2=x+dt_x[i];
                y2=y+dt_y[i];
                v[x2][y2]==1;
                dfs(x2,y2,x1,y1,step+1);
                v[x2][y2]==0;
            }
            if(step>minn)return;
        }
    }
}
int init(){
    cin>>n>>m;
    int k=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>map[i][j];
            if(map[i][j]==9){
                k++;
                target_x[k]=i;
                target_y[k]=j;
            }
        }
    }
    return k;
}//k个海螺,经过k+1个点 
int nums=init();//nums个海螺

void settle(){
    for(int i=0;i<=nums-1;i++){
        dfs(target_x[i],target_y[i],target_x[i+1],target_y[i+1],1);
    }
    return;
}

int search(int k){//实现海螺全排列 
    int i;
    for(i=1;i<=nums;i++) {
        if(!vv[i]){
            turn[k]=i;
            vv[i]=1;
            if(k==nums)settle();
            else search(k+1);
            vv[i]=0;
        }
    }
}
int main(int argc, char** argv) {
    target_x[0]=1;
    target_y[0]=1;
    cout<<minn;
    return 0;
}

  • 写回答

1条回答 默认 最新

  • 赵4老师 2022-08-04 15:53
    关注

    有时不将“调用函数名字+各参数值,进入函数后各参数值,中间变量值,退出函数前准备返回的值,返回函数到调用处后函数名字+各参数值+返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的,包括捕获各种异常、写日志到屏幕、单步或设断点或生成core或dmp文件、……这些方法都不行!

    评论

报告相同问题?

问题事件

  • 创建了问题 8月4日

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!