hrbust/哈理工oj 1657 数码世界【模拟】

数码世界

Time Limit: 1000 MS

Memory Limit: 32768 K

 

Total Submit: 18(12 users)

Total Accepted: 12(12 users)

Rating: 

Special Judge: No

 

Description

被选中的孩子们依靠正义的力量打败了数码世界中的邪恶力量,终于恢复了现实世界和数码世界的和平。在数码世界蔚蓝的天空下,Tailmon住在一片大平原上,这片平原的土地上有很奇怪的道路,假如它的家为坐标原点(0,0),那么这些路由这样的线段组成: [(0,0),(1,0)], [(1,0),(1,1)], [(1,1),(-1,1)], [(-1,1),(-1,-1)], [(-1,-1),(2,-1)], [(2,-1),(2,2)]等等。现在Tailmon想要走到点(x,y),请你计算一下从它家出发(0,0)延着上边描述的路线地形走,到达(x,y)需要转多少次弯?

 

Input

有多组测试数据,读到文件末尾,每组包含一个由空格分隔的两个整数x和y(|x|,|y| <= 100)。

Output

对应每组测试数据输出一个整数代表Tailmon转弯次数。

 

Sample Input

0 0

1 0

0 1

-1 -1

Sample Output

0

0

2

3

 

思路:按照它给的规律和规则来走。


我的可以这样来规定:

0表示向右走,1表示向上走,2表示向左走,3表示向下走。如果走到了该走到的位子,就要拐弯,向下一个方向走,如果向下走走过头的时候就要回退一步向右走,这个时候要把目标坐标的值+1.


Ac代码:

#include<stdio.h>
#include<string.h>
using namespace std;
struct zuobiao
{
    int x,y;
}now,nex;
int ex,ey;
int fx[4]={1,0,-1,0};
int fy[4]={0,1,0,-1};
int ok=0;
//right up left down;
//0 1 2 3
void dfs(int x,int y,int output,int mubiao,int fangxiang)
{
    if(ok==1)return ;//如果找到了目标坐标,return
    if(x==ex&&y==ey)
    {
        printf("%d\n",output);
        ok=1;
        return ;
    }
    if(fangxiang==0)//you
    {
        if(x+1>mubiao)//如果走过头了,转向,维护目标值
        {
            dfs(x,y+1,output+1,mubiao,1);
        }
        else dfs(x+1,y,output,mubiao,fangxiang);
    }
    if(fangxiang==1)//shang
    {
        if(y+1>mubiao)<span style="font-family: Arial, Helvetica, sans-serif;">//如果走过头了,转向,维护目标值</span>
        {
            dfs(x-1,y,output+1,0-mubiao,2);
        }
        else dfs(x,y+1,output,mubiao,fangxiang);
    }
    if(fangxiang==2)//zuo
    {
        if(x-1<mubiao)<span style="font-family: Arial, Helvetica, sans-serif;">//如果走过头了,转向,维护目标值
</span>        {
            dfs(x,y-1,output+1,mubiao,3);
        }
        else dfs(x-1,y,output,mubiao,fangxiang);
    }
    if(fangxiang==3)
    {
        if(y-1<mubiao)//如果走过头了,转向,维护目标值
        {
            dfs(x+1,y,output+1,0-mubiao+1,0);
        }
        else dfs(x,y-1,output,mubiao,fangxiang);
    }
}
int main()
{
    while(~scanf("%d%d",&ex,&ey))
    {
        ok=0;
        dfs(0,0,0,1,0);
    }
}










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值