当前位置: 代码迷 >> 综合 >> The Blocks Problem,Uva 101 BY 小黑
  详细解决方案

The Blocks Problem,Uva 101 BY 小黑

热度:43   发布时间:2023-11-13 20:26:40.0

赛题:
在这里插入图片描述在这里插入图片描述在这里插入图片描述
小黑题解:
题目大意为模仿一些木块的移动操作,本题最重要的难点在于弄清那几条英文命令的含义:
1.move a onto b :a,b上方的木块都归原位,然后再将a移到b上面
2.move a over b :a上方的木块归原位,然后再将a移到b所在木块堆上面
3.pile a onto b :b上方的木块归原位,然后再将a及其上方木块移到b上面
4.pile a over b :没有归位操作,将a及其上方的元素移动到b所在木块堆上面
然后用程序模仿即可
注意:
1.由于每次操作后木块堆的大小不确定,所以用可变数组Vector表示每一个木块堆比较方便,
2.当我们可以不用关心容器中元素序列的具体数据结构时,我们可以将容器中元素通过迭代器依次访问
3.归位在题目中的意思是,将木块插入到堆号与木块编号相同的堆上的第0个元素上。。例如,我要将5号木块归位,则我需要将5号木块插入到5号堆中的第0个位置上(5号堆中其他元素依次向上移动)
本题输入格式为木块数量以及每个指令(quit结束),输出为每个木块位置
程序实现:

package 例题;
import java.util.Enumeration;
import java.util.Scanner;
import java.util.Vector;
public class TheBlocksPloblem {/** move a onto b  a,b上方都归位* move a over b  a上方归位* pile a onto b  b上方归位* pile a over b  a,b上方均不归位*///成员变量:static Vector<Integer>[] vectors;  //可变长数组static Enumeration<Integer> em;	//迭代器public static void main(String[] args) {System.out.println("请输入木块数量以及指令:");Scanner sc = new Scanner(System.in);int n = sc.nextInt();	//输入的木块数量,编号为0至n-1vectors = new Vector[n]; 	//初始化(可变长数组对象)数组空间for (int i = 0; i < n; i++) {	//初始化木块位置vectors[i] = new Vector<Integer>();	//初始化可变长数组对象vectors[i].add(i);	//将木块放到初始位置中}String in = sc.next();	//输入指令(move or pile or quit)while(!in.equals("quit")){	//如果输入指令为quit,则结束程序String[] arr = new String[4];	//初始化指令数组arr[0] = in;	arr[1] = sc.next();	//输入木块编号aarr[2] = sc.next();	//输入指令(onto or over)arr[3] = sc.next();	//输入木块编号bhandle(arr);	//处理指令in = sc.next();	//继续输入下一个指令的第一个字符串}display();	//显示所有木块的最终位置sc.close();}public static void handle(String[] l){	//指令处理函数int a = Integer.parseInt(l[1]);	//将木块编号转化为数字int b = Integer.parseInt(l[3]);	int ai = search(a);	//寻找对应木块编号所在的堆int bi = search(b);if(ai == bi){	//堆号相等则为非法指令,不予处理return;}if(l[2].equals("onto")){	//指令中有onto,则一定将b上的木块全部归位putInitial(bi,b);if(l[0].equals("move")){	//指令再中有move,则一定将a上的木块全部归位putInitial(ai,a);}}else{	//指令中有over,则一定将b上的木块全部归位if(l[0].equals("move")){	//指令再中有move,则一定将a上的木块全部归位putInitial(ai,a);}}move(ai,a,bi);	//移动函数}public static void move(int i,int block,int j){int index = vectors[i].indexOf(block);	//此木块在木块堆中的位置int heigh = vectors[i].size();	//该木块堆的高度for (int k = index; k < heigh; k++) {	//不断将此木块上方的木块移到j木块堆中vectors[j].add(vectors[i].get(index));vectors[i].remove(index);	//此木块已经移走,则在原堆中删除}}public static void putInitial(int i,int block){	//将i木块堆中块号为block的木块上方木块全部归为原位int index = vectors[i].indexOf(block);	//此木块在木块堆中的位置int heigh = vectors[i].size();	//该木块堆的高度for (int j = index+1; j < heigh; j++) {	//不断放回原位int number = vectors[i].get(index+1);vectors[number].insertElementAt(number, number);	//归位操作vectors[i].remove(index+1);	//此木块已经移走,则在原堆中删除}}public static int search(int block){	//搜索此木块所在的堆号for (int i = 0; i < vectors.length; i++) {if(vectors[i].contains(block)){	//此堆存在块号为block的木块return i;}}return -1;}public static void display(){	//输出木块位置for (int i = 0; i < vectors.length; i++) {em = vectors[i].elements();	//初始化迭代器System.out.print(i+": ");while(em.hasMoreElements()){	//依次迭代,直到迭代器中没有元素为止System.out.print(em.nextElement()+" ");}System.out.println();}}
}

输出:
在这里插入图片描述
PS:
这是我理解题意过程中的痛苦:
在这里插入图片描述

  相关解决方案