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-/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。