天天看點

啊哈!算法—小貓釣魚(Java實作)

星期天小哼和小哈約在一起玩桌遊,他們正在玩一個非常古怪的撲克遊戲——“小貓釣魚”。遊戲的規則是這樣的:将一副撲克牌平均分成兩份,每人拿一份。小哼先拿出手中的第一張撲克牌放在桌上,然後小哈也拿出手中的第一張撲克牌,并放在小哼剛打出的撲克牌的上面,就像這樣兩人交替出牌。出牌時,如果某人打出的牌與桌上某張牌的牌面相同,即可将兩張相同的牌及其中間所夾的牌全部取走,并依次放到自己手中牌的末尾。當任意一人手中的牌全部出完時,遊戲結束,對手獲勝。

//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;
} 
           

繼續閱讀