zoukankan      html  css  js  c++  java
  • poj 3009 curling2.0 (dfs)

    题意:一幅冰壶游戏地图中有起点,终点,墙,空地,每次从起点出发,求到达终点的最少步数;每次移动碰墙停止且墙消失,越出地图或步数大于10则失败;

    思路:用bfs不太好写,dfs暴搜;

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int n,m,s1,s2,num;
    int mm[50][50];
    int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
    void dfs(int x1,int y1,int step)
    {
        int i;
        if(step>10)
        {
            return;
        }
        for(i=0;i<4;i++)
        {
            int xx=x1+dir[i][0];
            int yy=y1+dir[i][1];
            if(xx<0||xx>=n||yy<0||yy>=m||mm[xx][yy]==1)
                continue;
            while(xx>=0&&xx<n&&yy>=0&&yy<m&&mm[xx][yy]!=3&&mm[xx][yy]!=1)
            {
                xx+=dir[i][0];yy+=dir[i][1];
            }
    
            if(mm[xx][yy]==3)
            {
                if(num>step+1)//更新最小步数
                num=step+1;return;
            }
            if(mm[xx][yy]==1)
            {
                mm[xx][yy]=0;
                dfs(xx-dir[i][0],yy-dir[i][1],step+1);
                mm[xx][yy]=1;
            }
        }
    }
    int main()
    {
        int i,j,k;
        while(scanf("%d%d",&m,&n)!=EOF)
        {
            if(n==0&&m==0) break;
            memset(mm,0,sizeof(mm));
            num=12;
            for(i=0;i<n;i++)
            {
                for(j=0;j<m;j++)
                {
                    scanf("%d",&mm[i][j]);
                    if(mm[i][j]==2)
                    {
                        s1=i;s2=j;mm[i][j]=0;
                    }
                }
            }
            dfs(s1,s2,0);
            if(num>10) printf("-1
    ");
            else printf("%d
    ",num);
        }
        return 0;
    }
  • 相关阅读:
    DM7 安装
    LeetCode 第 183 场周赛
    MySQL 源码中的 ut_a 、 ut_ad
    存储领域的会议和研究机构
    LeetCode 第 15 场双周赛
    LeetCode 第 167 场周赛
    值得推荐的C/C++框架和库
    InnoDB 中的锁实现
    LeetCode-第 166 场周赛
    LeetCode 第 165 场周赛
  • 原文地址:https://www.cnblogs.com/dashuzhilin/p/4433903.html
Copyright © 2011-2022 走看看