得到几个重要信息:
- 农夫和牛每分钟内的行动方式都是:前方有障碍,顺时针旋转90°,前方无障碍,前进一步。
- 农夫和牛同时运动,并且具有方向。
- 地图边缘也属于障碍物。
- 代码构思
模拟思路:用二维数组记录整张图,为防止越界同时让代码简短,把字符放在Farm[1][1]到Farm[10][10]里。用四个个变量记录农夫和牛的位置。每次只要对这些变量做出改变就行。
方向问题:农夫和牛都具有四个方向(向北,东,南,西),分别用数值1,2,3,4来代表四个方向。
1对北,2对东,3对南,4对西,这样对应是为了方便做拐弯(顺时针90°),用变量flag存储数值,如果遇到障碍就(flag=flag%4+1)实现1变2,2变3,3变4,4变1。
相遇问题:农夫和牛在图中最多各有400种状态(100个位置,每个位置有四个方向),也就是一张图最多出现400*400种情况,如果经过400*400分钟仍未相遇,就不能相遇。也可以设置一个很大的值当做临界点当做判断是否相遇的条件。
代码实现
#include<iostream>
using namespace std;
struct direction {
int x;
int y;
};//定义结构体记录牛和农夫位置(也可以不用结构体直接上四个变量)
direction farmer = { 0 }, cow = { 0 };//一牛一农夫
int main()
{
int time = 0;
int cowflag = 1, farmerflag = 1;//牛和农夫的方向,初始都向北,值为一
char Farm[12][12] = { 0 };
char c = '0';
for (int i = 1; i <= 10; i++)
{
scanf("%s", Farm[i]+1);//存储到Farm[i][1——10]
c = getchar();//防止读入空格
}
for (int i = 1; i <= 10; i++)//遍历找出牛和农夫的位置
{
for (int j = 1; j <= 10; j++)
{
if (Farm[i][j] == 'C')
{
cow.x = i; cow.y = j;
Farm[i][j] = '.';//找到后可以把该位置置为空地
}
else if (Farm[i][j] == 'F')
{
farmer.x = i; farmer.y = j;
Farm[i][j] = '.';//同理
}
}
}
for (time = 1; time <= 160000; time++)//模拟行动
{
//先判断方向并判断前方是不是空地'.'是的话可以向前走一步,否则拐弯
//先写牛和农夫先后顺序随意
if (cowflag == 1 && Farm[cow.x - 1][cow.y] == '.')cow.x--;
else if (cowflag == 2 && Farm[cow.x][cow.y + 1] == '.')cow.y++;
else if (cowflag == 3 && Farm[cow.x + 1][cow.y] == '.')cow.x++;
else if (cowflag == 4 && Farm[cow.x][cow.y - 1] == '.')cow.y--;
else cowflag = cowflag % 4 + 1;//拐弯
if (farmerflag == 1 && Farm[farmer.x - 1][farmer.y] == '.')farmer.x--;
else if (farmerflag == 2 && Farm[farmer.x][farmer.y + 1] == '.')farmer.y++;
else if (farmerflag == 3 && Farm[farmer.x + 1][farmer.y] == '.')farmer.x++;
else if (farmerflag == 4 && Farm[farmer.x][farmer.y - 1] == '.')farmer.y--;
else farmerflag = farmerflag % 4 + 1;//同理
if (farmer.x == cow.x && farmer.y == cow.y)break;//每次走完判断是否位置相同
}
if (time == 160001)printf("0");//经过160000后仍未相遇(160001是因为完整走完循环time++)
else printf("%d", time);
return 0;//完结撒花
}