中国海洋大学第四届朗讯杯高级组 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
原文地址:https://www.cnblogs.com/luyingfeng/p/3463638.html