这是一道模拟类型的题目,题目是这样的:
读完题后,大致可以将题目拆解为三个难点:
1.地图的生成
2.大叔和牛的移动
3. 什么时候才是无解
1.地图的生成
首先将地图周围摆上障碍物,得到一个(12*12)大小的地图;目的是方便判断,遇到障碍物和到达边界的判断条件就一致了。
接下来录入地图具体构造,以及大叔和牛的位置,并将两者所在的位置记为空地;
如下图所生成的地图:
2.人物的移动
按照题意,沿当前方向移动,遇到障碍物就顺时针旋转90°;注意:一分钟内只能进行步进一格或者旋转的动作!!
这是角色移动的函数:每次移动完后判断两者是否在一个点上,如果在就返回1,否则返回0
//function
public static int gogogo(char map[][]) {
int flag=0;//flag==1,F meet C
int con=0;
//niu
if(dir_c==3) {
if(map[Cx][Cy-1] == '.') {
Cy=Cy-1;
con=1;
}else {//遇到障碍
dir_c=1;
con=0;
}
}
else if(dir_c==4) {
if(map[Cx][Cy+1] == '.') {
Cy=Cy+1;con=1;
}else {//遇到障碍
dir_c=2;
con=0;
}
}
else if(dir_c==1) {
if(map[Cx-1][Cy] == '.') {
Cx=Cx-1;con=1;
}else {//遇到障碍
dir_c=4;
con=0;
}
}
else if(dir_c==2) {
if(map[Cx+1][Cy] == '.') {
Cx=Cx+1;con=1;
}else {//遇到障碍
dir_c=3;
con=0;
}
}
con=0;
//farmer
if(dir_f==3) {
if(map[Fx][Fy-1] == '.') {
Fy=Fy-1;con=1;
}else {//遇到障碍
dir_f=1;
con=0;
}
}else if(dir_f==4) {
if(map[Fx][Fy+1] == '.') {
Fy=Fy+1;con=1;
}else {//遇到障碍
dir_f=2;con=1;
con=0;
}
}else if(dir_f==1) {
if(map[Fx-1][Fy] == '.') {
Fx=Fx-1;con=1;
}else {//遇到障碍
dir_f=4;
con=0;
}
}else if(dir_f==2) {
if(map[Fx+1][Fy] == '.') {
Fx=Fx+1;con=1;
}else {//遇到障碍
dir_f=3;
con=0;
}
}
if(Fx==Cx && Fy==Cy)flag=1;
return flag;
}
3.判断无解
当:大叔和牛同时到达已经来过的地方,并且和当时来这的方向相同时,可以判断出是无解的;这里通过定义一个标志值来判断无解:
now=大叔x+大叔y*10+大叔方向*100+牛x*1000+牛y*10000+牛方向*100000;
//上1 下2 左3 右4
创建数组哈希思想快速找出是否无解:
static int index[] = new int[1000000];
while( index[now] == 0) {//judge case '0'
now=Fx+Fy*10+dir_f*100+Cx*1000+Cy*10000+dir_c*100000;
index[now]=1;
int flag=gogogo(map);count++;
now=Fx+Fy*10+dir_f*100+Cx*1000+Cy*10000+dir_c*100000;
if(flag == 1) {
ans = 1;//can catch
break;
}
}
AC通过,下面是完整代码:
package p1518;
import java.util.*;
public class Main {
//上1 下2 左3 右4
static int Fx,Fy,dir_f=1;
static int Cx,Cy,dir_c=1;
static int index[] = new int[1000000];
//function
public static int gogogo(char map[][]) {
int flag=0;//flag==1,F meet C
int con=0;
//niu
if(dir_c==3) {
if(map[Cx][Cy-1] == '.') {
Cy=Cy-1;
con=1;
}else {//遇到障碍
dir_c=1;
con=0;
}
}
else if(dir_c==4) {
if(map[Cx][Cy+1] == '.') {
Cy=Cy+1;con=1;
}else {//遇到障碍
dir_c=2;
con=0;
}
}
else if(dir_c==1) {
if(map[Cx-1][Cy] == '.') {
Cx=Cx-1;con=1;
}else {//遇到障碍
dir_c=4;
con=0;
}
}
else if(dir_c==2) {
if(map[Cx+1][Cy] == '.') {
Cx=Cx+1;con=1;
}else {//遇到障碍
dir_c=3;
con=0;
}
}
con=0;
//farmer
if(dir_f==3) {
if(map[Fx][Fy-1] == '.') {
Fy=Fy-1;con=1;
}else {//遇到障碍
dir_f=1;
con=0;
}
}else if(dir_f==4) {
if(map[Fx][Fy+1] == '.') {
Fy=Fy+1;con=1;
}else {//遇到障碍
dir_f=2;con=1;
con=0;
}
}else if(dir_f==1) {
if(map[Fx-1][Fy] == '.') {
Fx=Fx-1;con=1;
}else {//遇到障碍
dir_f=4;
con=0;
}
}else if(dir_f==2) {
if(map[Fx+1][Fy] == '.') {
Fx=Fx+1;con=1;
}else {//遇到障碍
dir_f=3;
con=0;
}
}
if(Fx==Cx && Fy==Cy)flag=1;
return flag;
}
public static void main(String[] args) {
//map initialize(begin with 0)
char map[][] = new char[12][12];
Scanner in = new Scanner(System.in);
for(int i=0;i<=11;i++) {
map[0][i]='*';
map[11][i]='*';
map[i][0]='*';
map[i][11]='*';
}
for(int i=1;i<11;i++) {
String str=in.next();
for(int j=1;j<11;j++) {
map[i][j]=str.charAt(j-1);
if(map[i][j]=='F') {
Fx=i;Fy=j;map[i][j]='.';
}else if(map[i][j]=='C') {
Cx=i;Cy=j;map[i][j]='.';
}
}
}
for(int i=0;i<12;i++) {
for(int j=0;j<12;j++)System.out.print(map[i][j]+" ");
System.out.println();
}
//move
int now=Fx+Fy*10+dir_f*100+Cx*1000+Cy*10000+dir_c*100000;
int count=0;
int ans=0;
while( index[now] == 0) {//judge case '0'
now=Fx+Fy*10+dir_f*100+Cx*1000+Cy*10000+dir_c*100000;
index[now]=1;
int flag=gogogo(map);count++;
now=Fx+Fy*10+dir_f*100+Cx*1000+Cy*10000+dir_c*100000;
//System.out.println(Fx+" "+Fy+" "+Cx+" "+Cy);
if(flag == 1) {
ans = 1;//can catch
break;
}
}
if(ans == 1)System.out.println(count);
else System.out.println(0);
}
}
另外:全局变量在调试过程中无法显示,就只能多设置几个点分别print出来了....