2J9A7QA6Q6889977
分析:这道题没什么思维难度,就是维护a,b以及桌子上的牌,只不过每一个是动态变化的,最后结束的条件就是一方手中的牌数目为0,看代码,逻辑是很简单的的:
import java.util.*;
public class Main {
static Scanner in = new Scanner(System.in);
static Vector init(String s) {//初始化
Vector res = new Vector();
for(int i = 0;i < s.length();i++)
res.add(s.charAt(i));
return res;
}
static int isWin(Vector v,char c) {//是否赢牌,即判断前面是否出现过
for(int i = 0;i < v.size() - 1;i++)
if(v.get(i)==c)
return i;
return -1;
}
static void print(Vector v) {
for(int i = 0;i < v.size();i++)
System.out.print(v.get(i));
System.out.println();
}
public static void main(String[] args) {
String a = in.next();
String b = in.next();
Vector aa = new Vector();
Vector bb = new Vector();
Vector cc = new Vector();
aa = init(a);
bb = init(b);
cc.clear();
char k;
int p = 0;
boolean f;
k = aa.remove(0);//a先出牌
cc.add(k);
f = true;
while(aa.size()!=0&&bb.size()!=0){
if(f) {//b出牌
f = false;
k = bb.remove(0);
cc.add(k);
p = isWin(cc, k);
if(p!=-1) {
for(int i = cc.size()-1;i >= p;i--) {
bb.add(cc.get(i));
}
while(cc.size()>p)
cc.remove(cc.size()-1);
f = true;//赢牌继续出
}
}else {//a出牌
f= true;
k = aa.remove(0);
cc.add(k);
p = isWin(cc, k);
if(p!=-1) {
for(int i = cc.size()-1;i >= p;i--) {
aa.add(cc.get(i));
}
while(cc.size()>p)
cc.remove(cc.size()-1);
f = false;//赢牌继续出
}
}
}
if(aa.size()==0)
print(bb);
if(bb.size()==0)
print(aa);
}
}
反思:使用动态数组的时候一定要注意,数组的长度会随着处理而变化,自然索引值也会变化,所以某些情况下利用for循环来遍历索引值是不可取的!