星期天小哼和小哈約在一起玩桌遊,他們正在玩一個非常古怪的撲克遊戲——“小貓釣魚”。遊戲的規則是這樣的:将一副撲克牌平均分成兩份,每人拿一份。小哼先拿出手中的第一張撲克牌放在桌上,然後小哈也拿出手中的第一張撲克牌,并放在小哼剛打出的撲克牌的上面,就像這樣兩人交替出牌。出牌時,如果某人打出的牌與桌上某張牌的牌面相同,即可将兩張相同的牌及其中間所夾的牌全部取走,并依次放到自己手中牌的末尾。當任意一人手中的牌全部出完時,遊戲結束,對手獲勝。
//a手牌
LinkedList<Integer> a = new LinkedList<>();
//b手牌
LinkedList<Integer> b = new LinkedList<>();
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入手牌個數:");
//手牌個數
int n = scanner.nextInt();
System.out.println("請輸入a的手牌:");
for (int i = 0; i < n ; i++){
a.addLast(scanner.nextInt());
}
System.out.println("請輸入b的手牌:");
for (int i = 0; i < n ; i++){
b.addLast(scanner.nextInt());
}
//定義一個棧,用來放置桌面手牌
Stack<Integer> stack = new Stack();
System.out.println("遊戲開始!");
//有一人手牌為空即為遊戲結束
while ( !a.isEmpty() && !b.isEmpty()){
int x = a.removeFirst();
if (a.isEmpty()){
//a獲勝
break;
}else {
if (stack.contains(x)){
//如果棧中有這張牌,a收牌
a.addLast(x);
int index = stack.search(x);
for(int i = 0; i<index;i++){
a.addLast(stack.pop());
}
}else {
//添加到棧中
stack.push(x);
//B出牌
int y = b.removeFirst();
if (b.isEmpty()){
//b獲勝
break;
}else {
if (stack.contains(y)){
//如果棧中有這張牌,b收牌
b.addLast(y);
int index = stack.search(y);
for(int i = 0; i<index;i++){
b.addLast(stack.pop());
}
}else {
stack.push(y);
}
}
}
}
}
if (a.isEmpty()){
System.out.println("a獲勝!");
}
if (b.isEmpty()){
System.out.println("b獲勝!");
}
System.out.println("遊戲結束!");
原書C語言算法
#include <stdio.h>
struct queue{
int data[1000];
int head;
int tail;
};
struct stack{
int data[10];
int top;
};
int main(){
struct queue q1,q2;
struct stack s;
int book[10];
int i,t;
//初始化隊列
q1.head=1; q1.tail=1;
q2.head=1; q2.tail=1;
//初始化棧
s.top=0;
//初始化用來标記的數組,用來标記哪些牌已經在桌上
for(i=1;i<=9;i++)
book[i]=0;
//依次向隊列插入6個數
//小哼手上的6張牌
for(i=1;i<=6;i++){
scanf("%d",&q1.data[q1.tail]);
q1.tail++;
}
//小哈手上的6張牌
for(i=1;i<=6;i++){
scanf("%d",&q2.data[q2.tail]);
q2.tail++;
}
//當隊列不為空的時候執行循環
while(q1.head<q1.tail && q2.head<q2.tail ) {
t=q1.data[q1.head];//小哼出一張牌
//判斷小哼目前打出的牌是否能赢牌
if(book[t]==0) {
//表明桌上沒有牌面為t的牌
//小哼此輪沒有赢牌
//小哼已經打出一張牌,是以要把打出的牌出隊
q1.head++;
s.top++;
s.data[s.top]=t; //再把打出的牌放到桌上,即入棧
book[t]=1; //标記桌上現在已經有牌面為t的牌
}else{
//小哼此輪可以赢牌
q1.head++;//小哼已經打出一張牌,是以要把打出的牌出隊
q1.data[q1.tail]=t;//緊接着把打出的牌放到手中牌的末尾
q1.tail++;
while(s.data[s.top]!=t) //把桌上可以赢得的牌依次放到手中牌的末尾
{
book[s.data[s.top]]=0;//取消标記
q1.data[q1.tail]=s.data[s.top];//依次放入隊尾
q1.tail++;
s.top--; //棧中少了一張牌,是以棧頂要減1
}
}
t=q2.data[q2.head]; //小哈出一張牌
//判斷小哈目前打出的牌是否能赢牌
if(book[t]==0) //表明桌上沒有牌面為t的牌
{
//小哈此輪沒有赢牌
q2.head++; //小哈已經打出一張牌,是以要把打出的牌出隊
s.top++;
s.data[s.top]=t; //再把打出的牌放到桌上,即入棧
book[t]=1; //标記桌上現在已經有牌面為t的牌
}
else
{
//小哈此輪可以赢牌
q2.head++;//小哈已經打出一張牌,是以要把打出的牌出隊
q2.data[q2.tail]=t;//緊接着把打出的牌放到手中牌的末尾
q2.tail++;
while(s.data[s.top]!=t) //把桌上可以赢得的牌依次放到手中牌的末尾
{
book[s.data[s.top]]=0;//取消标記
q2.data[q2.tail]=s.data[s.top];//依次放入隊尾
q2.tail++;
s.top--;
}
}
}
if(q2.head==q2.tail){
printf("小哼win\n");
printf("小哼目前手中的牌是");
for(i=q1.head;i<=q1.tail-1;i++)
printf(" %d",q1.data[i]);
if(s.top>0) //如果桌上有牌則依次輸出桌上的牌
{
printf("\n桌上的牌是");
for(i=1;i<=s.top;i++)
printf(" %d",s.data[i]);
}
else
printf("\n桌上已經沒有牌了");
}
else
{
printf("小哈win\n");
printf("小哈目前手中的牌是");
for(i=q2.head;i<=q2.tail-1;i++)
printf(" %d",q2.data[i]);
if(s.top>0) //如果桌上有牌則依次輸出桌上的牌
{
printf("\n桌上的牌是");
for(i=1;i<=s.top;i++)
printf(" %d",s.data[i]);
}
else
printf("\n桌上已經沒有牌了");
}
getchar();getchar();
return 0;
}