poj 3009 Curling 2.0

本文介绍了一个名为Curling2.0的迷宫寻路算法实现,该算法通过深度优先搜索(DFS)寻找从起点到终点的最短路径,并在过程中考虑了障碍物和特定条件下的路径优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Curling 2.0

只要步数超过了10||超过了之前已经存在的步数,就可以不用再继续往下找了

#include <iostream>
#include <cstdio>
#include <string.h>
#include <cstdlib>
#include <algorithm>
using namespace std;

int n, m;
int Map[30][30];
int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};
int sx, sy;
int ex, ey;
int flag;
int ans;

void dfs(int x, int y, int step)
{
//    printf("step==%d\n", step);
//    for(int i = 1;i <= n;i++){
//        for(int j = 1;j<=m;j++){
//            printf("%d ", Map[i][j]);
//        }
//        cout << endl;
//    }
//    printf("X%d Y%d\n", x, y);
  //  if(flag) return;
    if(step>=ans){
        return;
    }
    int F = 0;
    for(int i = 0;i < 4;i++){
        int xx = x+dx[i];
        int yy = y+dy[i];
        if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&Map[xx][yy]!=1){
            int xxx = x;
            int yyy = y;
            F = 0;
            while(1){
                xxx+=dx[i];
                yyy+=dy[i];
              //  printf("%d %d %d\n", xxx, yyy, Map[xxx][yyy]);
                if(xxx<=0||xxx>n||yyy<=0||yyy>m){
                    F =1;
                    break;
                }
                if(Map[xxx][yyy]==0){
                    continue;
                }else if(Map[xxx][yyy]==1){
                    Map[xxx][yyy] = 0;
                    xxx-=dx[i];
                    yyy-=dy[i];
                    break;
                }else if(Map[xxx][yyy]==3){
                //    printf("%d %d\n", step+1, ans);
                    if(step+1<ans){
                        ans = step+1;
                        flag = 1;
                        return;
                    }

                }
            }
            if(F == 1) continue;
            dfs(xxx,yyy,step+1);
            Map[xxx+dx[i]][yyy+dy[i]] = 1;
        }
    }
}

int main()
{
    while(~scanf("%d %d", &m, &n)){
        if(n==0||m==0) break;
        for(int i = 1;i <= n;i++){
            for(int j = 1;j <= m;j++){
                scanf("%d", &Map[i][j]);
                if(Map[i][j]==2){
                    Map[i][j] = 0;
                    sx = i; sy = j;
                }else if(Map[i][j] ==3){
                    ex = i; ey = j;
                }
            }
        }
        flag = 0;
        ans = 11;
        dfs(sx,sy,0);
        if(flag&&ans<=10){
            printf("%d\n", ans);
        }else{
            printf("-1\n");
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值