花花生米

导航

2017A组题

第一题:迷宫

题目大意:

星球的一处迷宫游乐场建在某个小山坡上。它是由10x10相互连通的小房间组成的。房间的地板上写着一个很大的字母。我们假设玩家是面朝上坡的方向站立,则:L表示走到左边的房间,R表示走到右边的房间,U表示走到上坡方向的房间,D表示走到下坡方向的房间。X星球的居民有点懒,不愿意费力思考。他们更喜欢玩运气类的游戏。这个游戏也是如此!开始的时候,直升机把100名玩家放入一个个小房间内。玩家一定要按照地上的字母移动。
迷宫地图如下:
UDDLUULRUL
UURLLLRRRU
RRUURLDLRD
RUDDDDUUUU
URUDLLRRUU
DURLRLDLRL
ULLURLLRDU
RDLULLRDDD
UUDDUDUDLL
ULRDLUURRR
请你计算一下,最后,有多少玩家会走出迷宫? 而不是在里边兜圈子。
输出
输出一个整数表示答案

/*

  • 1.迷宫
  • 答案:31
    */
import java.util.Scanner;

public class main01 {

	static boolean vis[][]= new boolean[12][12];
	static char a[][]=new char[12][12];
	static Scanner in=new Scanner (System.in);
	static int ans=0;
	public static boolean inmap(int i,int j)
	{
		return(i<0||i>9||i<0||j>9);
	}
	public static void dfs(int i,int j)
	{
		if(inmap(i,j))
		{
			ans++;
			return;
		}
		else {
			if(vis[i][j]==true)//如果被搜索过就结束这一点
				return;
			vis[i][j]=true;//标记被搜索了
			if(a[i][j]=='U')
				dfs(i-1,j);
			if(a[i][j]=='D')
				dfs(i+1,j);
			if(a[i][j]=='L')
				dfs(i,j-1);
			if(a[i][j]=='R')
				dfs(i,j+1);
			
				
		}
	}
	public static void in()
	{//初始化
		for (int j2 = 0; j2 < 10; j2++) {
			for (int k = 0; k < 10; k++) {
				vis[j2][k]=false;
			}
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		for (int i = 0; i < 10; i++) {
			a[i]=in.nextLine().toCharArray();
		}
		for (int i = 0; i < 10; i++) {
			for (int j = 0; j < 10; j++) {
				in();
				dfs(i,j);
			}
		}
		System.out.println(ans);
		in.close();
	}
}
  • 解析:典型的深搜案例,所以不过多解说

第二题:跳蚱蜢

题目大意:

如图所示: 有9只盘子,排成1个圆圈。其中8只盘子内装着8只蚱蜢,有一个是空盘。

我们把这些蚱蜢顺时针编号为 1~8。每只蚱蜢都可以跳到相邻的空盘中,也可以再用点力,越过一个相邻的蚱蜢跳到空盘中。
请你计算一下,如果要使得蚱蜢们的队形改为按照逆时针排列,并且保持空盘的位置不变(也就是1-8换位,2-7换位,...),至少要经过多少次跳跃?
输出
输出一个整数表示答案

Node{
	public int num;//序号情况
	public int step;//步数
}

public class main02 {

	public static Set<Integer> set=new LinkedHashSet<Integer>();//用来去重
	public static int num[]= {1,2,3,4,5,6,7,8,9};//把空盘子当作9,因为当作0来看,在这一步node.num=123456789;会报错:超出范围
	public static int next[]= {-1,1,2,-2};//跳的盘子信息
	
	public static void swap(int i,int j)//交换两个的位置
	{
		int temp;
		temp=num[i];
		num[i]=num[j];
		num[j]=temp;
	}
	
	public static int math()//转换为数值
	{
		int ans=0;
		for(int i=0;i<9;i++)
		{
			ans=ans*10+num[i];
		}
		return ans;
	}
	
	public static void bfs()
	{
		//创建队列
		Queue<Node> queue=new LinkedList<Node>();
		Node node=new Node();
		//最开始状态
		node.num=123456789;
		node.step=0;
		set.add(node.num);
		queue.add(node);
		
		while(!queue.isEmpty())
		{
			Node first=new Node();
			first=queue.poll();
			int pi=0;
			int NUM=first.num;//比如:123456789
			//找到空盘子9的位置
			for (int i=8;i>=0;i--) {
				if(NUM%10==9)
					pi=i;
				num[i]=NUM%10;
				NUM/=10;
				
			}
			for(int i=0;i<4;i++)
			{
				swap(pi,(pi+next[i]+9)%9);
				Node second=new Node();
				second.num=math();
				second.step=first.step+1;
				if(second.num==876543219)
				{
					System.out.println(second.step);
					return;
				}
				if(!set.contains(second.num))
				{
					set.add(second.num);
					queue.add(second);
				}
				swap(pi,(pi+next[i]+9)%9);
			}
			
		}
	}
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner(System.in);
		bfs();
	}
	
}

posted on 2021-07-13 16:43  花花生米  阅读(24)  评论(0编辑  收藏  举报