赛题:
小黑题解:
题目大意为模仿一些木块的移动操作,本题最重要的难点在于弄清那几条英文命令的含义:
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:
这是我理解题意过程中的痛苦: