码迷,mamicode.com
首页 > 其他好文 > 详细

盲目的毛驴和老虎 donkeytiger

时间:2016-08-27 23:15:22      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:

【题目描述】:

在中国的贵州省没有驴子。一个麻烦制造者运了一头毛驴,并把它放在森林中,森林可视为一个N*N的网格。左上角坐标(0,0),右下角坐标(n-1,n-1)。前一个数字是行号,后一个是列号。

驴子过着幸福的生活,直到它远远的看见一只老虎。驴子从来没有见过老虎,老虎也从来没有见过驴子。他们两个都害怕,想逃避对方。所以他们开始跑得很快。因为他们害怕,他们以一种没有任何意义的方式开跑。他们每一步都移动到在他们的运行方向上的下一个格子,但他们不能离开森林。因为他们都想去新的地方,驴子永远不会进入一个已经被自己访问的格子,老虎也采取同样的方式。驴子和老虎开始时都是随机一个方向跑,他们总是有相同的速度。他们不会改变他们的方向,直到他们不能再向前跑了。如果他们不能再往前走了,他们立刻改变了方向。当改变方向时,驴子总是向右转,老虎总是向左拐。如果他们转弯,仍然不能继续前进,他们会停止运行,并留在他们的地方,而不试图再向下一个方向转弯。现在给出他们的起始位置和方向,如果驴和老虎能在同一个格子里面相遇,则输出坐标,否则输出-1

 

【输入描述】:

输入有几个测试用例。在每个测试用例中:

第一行是一个整数n,这意味着森林是一个N*N的网格。

第二行包含三个整数RCD,这意味着,驴开始在格子(RC),D是开跑的方向,可以是01230意味着东方,1意味着南方,2意味着西方,3意味着北(上为北)。

第三行格式相同,它指的是老虎。

最后一行以一个0结束。

 

【输出描述】:

对于每一个测试,输出它们第一次相遇的单元的坐标,如果不能相遇输出-1

 

【样例输入】

【样例输出】

2

0 0 0

0 1 2

4

0 1 0

3 2 0

0

-1

1 3

【数据范围及描述】:

2 <= N <= 1000, 0 <= R, C < N

 

这是一道模拟题,形式上类似于搜索。

只提一点:注意一开始就在一起的情况!

 

技术分享
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 const int maxn=1005;
 8 const int dx[]={0,1,0,-1};
 9 const int dy[]={1,0,-1,0};
10 int N;
11 int R1,C1,D1,R2,C2,D2;
12 bool V1[maxn][maxn],V2[maxn][maxn];
13 
14 void work()
15 {
16     memset(V1,false,sizeof(V1));
17     memset(V2,false,sizeof(V2));
18     int x1(R1),x2(R2),y1(C1),y2(C2),z1(D1),z2(D2);
19     V1[x1][y1]=true;V2[x2][y2]=true;
20     bool f1,f2;
21     f1=f2=true;
22     while(f1||f2)
23     {
24         if(x1==x2&&y1==y2)
25         {
26             printf("%d %d\n",x1,y1);
27             return;
28         }
29         if(f1)
30         {
31             int xx=x1+dx[z1];
32             int yy=y1+dy[z1];
33             if(xx<0||xx>=N||yy<0||yy>=N||V1[xx][yy])
34             {
35                 z1=(z1+1)%4;
36                 xx=x1+dx[z1];
37                 yy=y1+dy[z1];
38                 if(xx<0||xx>=N||yy<0||yy>=N||V1[xx][yy]) f1=false;
39                 else
40                 {
41                     V1[xx][yy]=true;
42                     x1=xx;y1=yy;
43                 }
44             }
45             else
46             {
47                 V1[xx][yy]=true;
48                 x1=xx;y1=yy;
49             }
50         }
51         if(f2)
52         {
53             int xx=x2+dx[z2];
54             int yy=y2+dy[z2];
55             if(xx<0||xx>=N||yy<0||yy>=N||V2[xx][yy])
56             {
57                 z2=(z2+3)%4;
58                 xx=x2+dx[z2];
59                 yy=y2+dy[z2];
60                 if(xx<0||xx>=N||yy<0||yy>=N||V2[xx][yy]) f2=false;
61                 else
62                 {
63                     V2[xx][yy]=true;
64                     x2=xx;y2=yy;
65                 }
66             }
67             else
68             {
69                 V2[xx][yy]=true;
70                 x2=xx;y2=yy;
71             }
72         }
73     }
74     cout<<-1<<endl;
75     return;
76 }
77 
78 int main()
79 {
80     while(scanf("%d",&N)!=EOF)
81     {
82         if(N==0) break;
83         scanf("%d %d %d",&R1,&C1,&D1);
84         scanf("%d %d %d",&R2,&C2,&D2);
85         work();
86     }
87     return 0;
88 }
View Code

 

技术分享

 

盲目的毛驴和老虎 donkeytiger

标签:

原文地址:http://www.cnblogs.com/cnblogsLSY/p/5813961.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!