POJ3009打冰球

本文介绍了一种基于深度优先搜索(DFS)的算法,用于解决在一个由冰块组成的矩阵中寻找从起点到终点的最短路径问题。冰球只能沿四个方向滑动,并在遇到冰块时改变方向或停止。该算法考虑了不超过10步的限制条件。

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

题意:给你一个矩阵 1是冰块 2是 起点 3 是终点
条件 冰球只能四个方向移动(滑行) 碰到冰块才能停下 (改变方向) 碰完冰块 冰块就被球撞碎了
如果起点四个方向都是冰块 被认为是不可以移动的
移动的不能超过10步

/*
 32ms 132k
*/
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<climits>

#define maxn 25
#define inMap(x,y) 0<=x&&x<n&&0<=y&&y<m
#define sca(a) scanf("%d",&a)
#define scab(a,b) scanf("%d%d",&a,&b)

using namespace std;

int Map[maxn][maxn];
int ans;
bool flag;
int m,n,startx,starty,endx,endy;
int ef[4][2]={ { 1,0 },{ 0,1 },{ -1,0 },{ 0,-1 } };//方向

void dfs(int x,int y,int step)
{
    if(step>10)
    {
        return;
    }
    if(ans<=step)
        return;
    for(int i=0;i<4;i++)
    {
        int nextx=x+ef[i][0],nexty=y+ef[i][1];
        if (inMap(nextx,nexty)&&Map[nextx][nexty]==0){

            while(inMap(nextx,nexty)&&Map[nextx][nexty]==0)
            {
                if(nextx==endx&&nexty==endy)
                {
                    if(ans>step)
                    {
                        ans=step;
                    }
                    if(!flag)
                    {
                        flag=true;
                    }
                }
                nextx+=ef[i][0];
                nexty+=ef[i][1];
            }
            if(inMap(nextx,nexty)&&Map[nextx][nexty]==1)
            {
                Map[nextx][nexty]=0;
                dfs(nextx-ef[i][0],nexty-ef[i][1],step+1);
                Map[nextx][nexty]=1;
            }
        }
    }
}
int main()
{
    while(~scab(m,n)&&n+m)
    {
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                sca(Map[i][j]);
                if(Map[i][j]==2)
                {
                    startx=i;
                    starty=j;
                    Map[i][j]=0;
                }
                if(Map[i][j]==3)
                {
                    endx=i;
                    endy=j;
                    Map[i][j]=0;
                }
            }
        }
        flag=false;
        ans=INT_MAX;
        dfs(startx,starty,1);
        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、付费专栏及课程。

余额充值