纯模拟题,先定义可能需要的变量
int a[12][12], cx, cy, fx, fy; // 障碍物, 牛横纵, John横纵
char map; // 地图
int move_s; // 统计移动次数
int mf, mc; // John的移动方向, 牛的移动方向(0上 1右 2下 3左)
int step; // 一步一步走
int turn; // 转弯
首先输入地图
for (int i = 1; i <= 10; i++) { for (int j = 1; j <= 10; j++) { cin >> map; // 输入地图 if (map == '*') // 障碍物 { a[j][i] = -1; } if (map == 'C') // 记录牛的初始位置 { cx = j; cy = i; } if (map == 'F') // 记录John的初始位置 { fx = j; fy = i; } } }
现在开始模拟
while ((cx != fx || cy != fy) && move_s < 200000) { }
先来模拟牛的移动
if (mc == 0 && step == 0) // 牛向北移动 { step = 1; //一步一步走 if (a[cx][cy - 1] != -1 && cy > 1) { turn = 1; cy--; // 在地图上为向上走 } if (turn == 0) // 证明该转弯啦 { mc++; // 顺时针下一分钟该向右(东)移动 } } if (mc == 1 && step == 0) // 牛向东移动 { step = 1; //一步一步走 if (a[cx + 1][cy] != -1 && cx < 10) { turn = 1; cx++; // 在地图上为向右走 } if (turn == 0) // 证明该转弯啦 { mc++; // 顺时针下一分钟该向下(南)移动 } } if (mc == 2 && step == 0) // 牛向南移动 { step = 1;//一步一步走 if (a[cx][cy + 1] != -1 && cy < 10) { turn = 1; cy++; // 在地图上为向下走 } if (turn == 0) // 证明该转弯啦 { mc++; // 顺时针下一分钟该向左(西)移动 } } if (mc == 3 && step == 0) // 牛向西移动 { step = 1; //一步一步走 if (a[cx - 1][cy] != -1 && cx > 1) { turn = 1; cx--; // 在地图上为向左走 } if (turn == 0) { mc++; } }
John的移动方式和牛一样
if (mf == 0 && step == 0) // John向北移动 { step = 1; //一步一步走 if (a[fx][fy - 1] != -1 && fy > 1) { turn = 1; fy--; // 在地图上为向上走 } if (turn == 0) // 证明该转弯啦 { mf++; // 顺时针下一分钟该向右(东)移动 } } if (mf == 1 && step == 0) // John向东移动 { step = 1; //一步一步走 if (a[fx + 1][fy] != -1 && fx < 10) { turn = 1; fx++; // 在地图上为向右走 } if (turn == 0) // 证明该转弯啦 { mf++; // 顺时针下一分钟该向下(南)移动 } } if (mf == 2 && step == 0) // John向南移动 { step = 1; //一步一步走 if (a[fx][fy + 1] != -1 && fy < 10) { turn = 1; fy++; // 在地图上为向下走 } if (turn == 0) // 证明该转弯啦 { mf++; // 顺时针下一分钟该向左(西)移动 } } if (mf == 3 && step == 0) // John向西移动 { step = 1; //一步一步走 if (a[fx - 1][fy] != -1 && fx > 1) { turn = 1; fx--; // 在地图上为向左走 } if (turn == 0) { mf++; } }
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <iostream> using namespace std; int a[12][12], cx, cy, fx, fy; // 障碍物, 牛横纵, John横纵 char map; // 地图 int move_s; // 统计移动次数 int mf, mc; // John的移动方向, 牛的移动方向(0上 1右 2下 3左) int step; // 一步一步走 int turn; // 转弯 int main() { for (int i = 1; i <= 10; i++) { for (int j = 1; j <= 10; j++) { cin >> map; // 输入地图 if (map == '*') // 障碍物 { a[j][i] = -1; } if (map == 'C') // 记录牛的初始位置 { cx = j; cy = i; } if (map == 'F') // 记录John的初始位置 { fx = j; fy = i; } } } while ((cx != fx || cy != fy) && move_s < 200000) { mf %= 4; // 总共四个方向,所以模4判断 mc %= 4; move_s++; // 统计行走次数 step = 0; // 判断是否移动 turn = 0; // 判断是否转弯 // 牛移动 if (mc == 0 && step == 0) // 牛向北移动 { step = 1; //一步一步走 if (a[cx][cy - 1] != -1 && cy > 1) { turn = 1; cy--; // 在地图上为向上走 } if (turn == 0) // 证明该转弯啦 { mc++; // 顺时针下一分钟该向右(东)移动 } } if (mc == 1 && step == 0) // 牛向东移动 { step = 1; //一步一步走 if (a[cx + 1][cy] != -1 && cx < 10) { turn = 1; cx++; // 在地图上为向右走 } if (turn == 0) // 证明该转弯啦 { mc++; // 顺时针下一分钟该向下(南)移动 } } if (mc == 2 && step == 0) // 牛向南移动 { step = 1;//一步一步走 if (a[cx][cy + 1] != -1 && cy < 10) { turn = 1; cy++; // 在地图上为向下走 } if (turn == 0) // 证明该转弯啦 { mc++; // 顺时针下一分钟该向左(西)移动 } } if (mc == 3 && step == 0) // 牛向西移动 { step = 1; //一步一步走 if (a[cx - 1][cy] != -1 && cx > 1) { turn = 1; cx--; // 在地图上为向左走 } if (turn == 0) { mc++; } } // John移动 step = 0; turn = 0; if (mf == 0 && step == 0) // John向北移动 { step = 1; //一步一步走 if (a[fx][fy - 1] != -1 && fy > 1) { turn = 1; fy--; // 在地图上为向上走 } if (turn == 0) // 证明该转弯啦 { mf++; // 顺时针下一分钟该向右(东)移动 } } if (mf == 1 && step == 0) // John向东移动 { step = 1; //一步一步走 if (a[fx + 1][fy] != -1 && fx < 10) { turn = 1; fx++; // 在地图上为向右走 } if (turn == 0) // 证明该转弯啦 { mf++; // 顺时针下一分钟该向下(南)移动 } } if (mf == 2 && step == 0) // John向南移动 { step = 1; //一步一步走 if (a[fx][fy + 1] != -1 && fy < 10) { turn = 1; fy++; // 在地图上为向下走 } if (turn == 0) // 证明该转弯啦 { mf++; // 顺时针下一分钟该向左(西)移动 } } if (mf == 3 && step == 0) // John向西移动 { step = 1; //一步一步走 if (a[fx - 1][fy] != -1 && fx > 1) { turn = 1; fx--; // 在地图上为向左走 } if (turn == 0) { mf++; } } } if (move_s == 200000) printf("0\n"); else printf("%d\n", move_s); return 0; }
创作不易,感谢各位大佬支持