中国海洋大学第四届朗讯杯高级组 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",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\n",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\n",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\n",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

 

你可能感兴趣的:(oc)