[洛谷每日一题]P1518两只塔姆沃斯牛 The Tamworth Two

这是一道模拟类型的题目,题目是这样的:

 

读完题后,大致可以将题目拆解为三个难点:

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出来了.... 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值