L2-037 包装机 - java

题目解析

给定n行m个字母 以及最大容量为Smax的框

每次给定一个指令
-1 结束指令
0 夹出框中最上面的一个字母 放到流水线上
非零 去非零行推出一个字母 如果框中满了 先执行0的指令 再将给零行的字母推入框中

去判断最后流水线上有那些字母

解题思路

栈的应用

按照指令执行

先去判断指令是啥

-1 退出 结束输入

0 从非空栈中 夹出一个字符

非零 如果栈中满了 就先执行指令0的操作 然后从非空轨道上推出一个字符到框中


只需要有一个数组去记录每行推送到第几个字母

然后就 if if if if if 判断就好了

代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.LinkedList;

public class Main
{
	public static void main(String[] args) throws IOException
	{
		int n = ini(), m = ini(), Smax = ini();

		char map[][] = new char[n + 10][m + 10];
		for (int i = 1; i <= n; i++)
			map[i] = ins().toCharArray();

		int step[] = new int[n + 10]; // 记录每条轨道上该取第几个字母
		LinkedList<Character> q = new LinkedList<Character>(); // 记录框里的字母

		StringBuilder res = new StringBuilder(); // 记录流水线上的字母
		while (true)
		{
			int x = ini();
			if (x == -1)
				break;
			else if (x == 0 && q.size() != 0)
				res.append(q.poll());
			else if (x != 0)
			{
				if (step[x] == m) // 轨道上已经没有任何东西了
					continue;

				if (q.size() == Smax) // 框里已经满了
					res.append(q.poll());

				q.push(map[x][step[x]++]);
			}
		}
		out.println(res);

		out.flush();
		out.close();
	}

	static StreamTokenizer sc = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
	static PrintWriter out = new PrintWriter(System.out);

	static int ini() throws IOException
	{
		sc.nextToken();
		return (int) sc.nval;
	}

	static String ins() throws IOException
	{
		sc.nextToken();
		return sc.sval;
	}
}

LinkedList

StringBuilder


团体程序设计天梯赛-练习集-java

赞赏