1.构建地图 (矩阵读入)矩阵边缘围上一圈障碍物;
2.模拟F和C的运动
先判断前方是否有障碍物
如果没有障碍物,前进一步
如果有障碍物,改变方向
向北:x-1,y;
向东:x, y+1;
向南:x+1,y;
向西:x, y-1;
表示方向0北,1东,2南,3西//用数组表示方向dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
3.判断是否相遇,如果相遇,输出步数,退出循环
4.如果死循环,输出0
多维数组储存情况,两者重复经过同一情况,说明永不可相遇
先后两次从同一方向经过同一地点,死循环
#include<iostream>
#include<algorithm>
#include<string.h>
#define IOS std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
using namespace std;
typedef long long ll;
int s[25][25],dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
typedef struct node{//有三种属性,使用结构体
int x,y,f;//f表示方向,0北,1东,2南,3西;
}node;
node cow,farmer;//定义两个结构体
void tmove(){
//判断前方是不是障碍
int fx=farmer.x+dx[farmer.f],fy=farmer.y+dy[farmer.f];//农夫的下一位置
int cx=cow.x+dx[cow.f],cy=cow.y+dy[cow.f];
if(s[fx][fy]){//如果是1,进入if;如果是0,不进入
farmer.x=fx;
farmer.y=fy;
}
else farmer.f=(farmer.f+1)%4;//转向
//cow的情况
if(s[cx][cy]){
cow.x=cx;
cow.y=cy;
}
else cow.f=(cow.f+1)%4;
}
bool mark[11][11][4][11][11][4];//判断是否John和cow是否都经过了此情况
int main(){
IOS;//cin,cout加速器
char tmpc;//暂时代表字符进行判断
int timek=0;//移动时间
for(int i=1;i<=10;i++){//构建地图
for(int j=1;j<=10;j++){
cin>>tmpc;//读入字符
if(tmpc=='*')continue;//障碍,不做变化
s[i][j]=1;//空地,能走为1
//读入cow的位置,方向
if(tmpc=='C'){
cow.x=i;
cow.y=j;
cow.f=0;
}
//读入farmer的位置,方向
if(tmpc=='F'){
farmer.x=i;
farmer.y=j;
farmer.f=0;
}
}
}
while(farmer.x!=cow.x||farmer.y!=cow.y){//模拟运动
timek++;
if(mark[farmer.x][farmer.y][farmer.f][cow.x][cow.y][cow.f]==1){
cout<<0;
return 0;
}
mark[farmer.x][farmer.y][farmer.f][cow.x][cow.y][cow.f]=1;//这种情况已经发生,记录为1
tmove();
}
cout<<timek;
return 0;
}