zoukankan      html  css  js  c++  java
  • 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();
    	}
    	
    }
    

    作者:Better又
    出处:https://www.cnblogs.com/lwyy1223-/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    openVolumeMesh example 程序学习
    使用字符串创建java 对象
    HDU-1501-Zipper
    UVA-10285-Longest Run on a Snowboard
    HDU-2182-Frog
    HDU-2044-一只小蜜蜂
    POJ-1163-The Triangle
    HDU-1159-Common Subsequence
    HDU-2069-Coin Change
    HDU-4864-Task
  • 原文地址:https://www.cnblogs.com/lwyy1223-/p/14576330.html
Copyright © 2011-2022 走看看