题目解析
给定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;
}
}