zoukankan      html  css  js  c++  java
  • 中国海洋大学第四届朗讯杯高级组 A Rocky

    http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2718&cid=1203

    题意:给你一个m乘n的格子阵,从一边进去,直线往前走,如果前边有石头就往右走,如果右边还有石头就往左走,如果左边还有石头就忘回走,会给你一个起始点的坐标,当然是在4条边上,但是不会在角上,问你在哪个格子走出去,且走了多少步。

    思路:DFS。好吧,当时做的时候卡在这儿,一直没D出来。。。。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int maxn=100;
    int map[maxn][maxn];
    
    int step=1,n,m;
    void dfs(int x,int y,int flag)
    {
        if(flag == 1)//
        {
            bool flag1 = false;
            for(int i = x ; i <= n ; i++)
            {
                if(map[i][y])//一直走直到前边是石头为止
                {
                    flag1 = true ;
                    step += (i-x-1);//把前边走过的都加上但要减去当前占的这个格子,所以减1
                    if(!map[i-1][y-1])//如果右边没有石头向右转
                    {
                        dfs(i-1,y,4);//右的右边是下
                        break;//结束掉每一次的循环,因为有石头之后循环就不应该进行了
                    }
                    else if(map[i-1][y-1]&&!map[i-1][y+1])//向上
                    {
                        dfs(i-1,y,2);
                        break;
                    }
                    else if(map[i-1][y-1]&&map[i-1][y+1])//回去
                    {
                        dfs(i-1,y,3);
                        break;
                    }
                }
            }
            if(!flag1)
            {
                step += (n-x);
                printf("%d %d %d
    ",n,y,step);
                return;
            }
        }
        else if(flag == 2)//
        {
            bool flag2=false;
            for(int i = y ; i <= m ; i++)
            {
                if(map[x][i])
                {
                    flag2 = true ;
                    step += (i-y-1) ;
                    if(!map[x+1][i-1])
                    {
                        dfs(x,i-1,1);
                        break;
                    }
                    else if(map[x+1][i-1]&&!map[x-1][i-1])
                    {
                        dfs(x,i-1,3);
                        break;
                    }
                    else if(map[x+1][i-1]&&map[x-1][i-1])
                    {
                        dfs(x,i-1,4);
                        break;
                    }
                }
            }
            if(!flag2)
            {
                step += (m-y);
                printf("%d %d %d
    ",x,m,step);
            }
        }
        else if(flag == 3)//
        {
            bool flag3 = false;
            for(int i = x ; i >= 1 ; i--)
            {
                if(map[i][y])
                {
                    flag3 = true ;
                    step += (x-i-1);
                    if(!map[i+1][y+1])
                    {
                        dfs(i+1,y,2);
                        break;
                    }
                    else if(map[i+1][y+1]&&!map[i+1][y-1])
                    {
                        dfs(i+1,y,4);
                        break;
                    }
                    else if(map[i+1][y+1]&&map[i+1][y-1])
                    {
                        dfs(i+1,y,1);
                        break;
                    }
                }
            }
            if(!flag3)
            {
                step += x-1;
                printf("%d %d %d
    ",1,y,step);
            }
        }
        else if(flag == 4)//
        {
            bool flag4 = false;
            for(int i = y ; i >= 1 ; i--)
            {
                if(map[x][i])
                {
                    flag4 = true;
                    step += (y-i-1);
                    if(!map[x-1][i+1])
                    {
                        dfs(x,i+1,3);
                        break;
                    }
                    else if(map[x-1][i+1]&&!map[x+1][i+1])
                    {
                        dfs(x,i+1,1);
                        break;
                    }
                    else if(map[x-1][i+1]&&map[x+1][i+1])
                    {
                        dfs(x,i+1,2);
                        break;
                    }
                }
            }
            if(!flag4)
            {
                step += y-1;
                printf("%d %d %d
    ",x,1,step);
            }
        }
    }
    
    int main()
    {
        int k,sx,sy;
        int cnt = 1 ;
        while(scanf("%d%d%d",&n,&m,&k)!=EOF)
        {
            if(n==0&&m==0&&k==0) break;
            step = 1 ;//初始格子算一步
            memset(map,0,sizeof(map));
            for(int i = 0 ; i < k ; i++)
            {
                int x,y;
                scanf("%d%d",&x,&y);
                map[x][y] = 1 ;//将这些点标记为1代表不能走
            }
            int flag;
            scanf("%d %d",&sx,&sy);
            if(sx == 1) flag = 1 ;//
            else if(sy == 1) flag = 2 ;//
            else if(sy == m) flag = 4 ;//
            else if(sx == n) flag = 3 ;//
            printf("Case %d: ",cnt);
            cnt++;
            dfs(sx,sy,flag);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    删除ubuntu中多余的主题和背景文件
    android 开发之动画Activity
    android开发之自定义组件
    android 开发之Activity切换
    程序设计课件
    初识Proximal Policy Optimization (PPO)
    初识Auction Theory
    什么是Experience Replay和Seperate Target Networks
    初识ActorCritic
    初识Stackelberg Game
  • 原文地址:https://www.cnblogs.com/luyingfeng/p/3463638.html
Copyright © 2011-2022 走看看