数码世界 | ||||||
| ||||||
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);
}
}