題目:
星期天小a和小b約在一起玩桌遊,他們在玩乙個非常古怪的撲克遊戲—「小貓遊戲」。遊戲的規則是這樣的:將一副撲克牌平均分成兩份,每個人拿乙份。小a先拿出手中的第一張撲克牌放在桌子上,然後將小b也拿出手中的第一張撲克牌,並放在小a剛打出的撲克牌的上面,就像這樣倆個仁交替出牌。出牌時,如果某人打出牌與桌面上的牌面相同,即可將倆張相同的牌及其中間所夾得牌全部取走,並依次放到自己手中得最後,當任意乙個人手中的牌全部出完時,遊戲結束,對手獲勝。
假如遊戲開始時,小a手中有6張牌,順序為2 4 1 2 5 6,小b手中也有6張牌,順序為3 1 3 5 6 4,最終誰會獲勝呢?
要求接下來請你寫乙個自動判斷誰將獲勝的程式,這裡我們做乙個規定,小a 和小b 手中的牌面只有1~9。
題目分析
小a有2種操作,分別是出牌和贏牌。這相當於佇列的2個操作,出牌就是出隊,贏牌就是入隊。小b的操作和小a是一樣的。桌子就像乙個棧,沒打出乙個牌就相當於入棧,有人贏牌的時候將牌拿走相當於出棧。那麼如何知道桌子上面已經有哪些牌呢?最簡單的方法就是列舉桌子上面的每一張牌。
struct queue
;#再創乙個結構體來實現棧
struct stack
;#定義2個佇列q1和q2,q1表示小a手中的牌,q2表示小b手中的牌。定義乙個棧變數s來模擬桌子上面的牌
struct queue q1,q2;
struct stack s;
#初始化佇列q1和q2為空,此時2人手中都還沒有牌
q1.head=1;
q1.tail=1;
q2.head=1;
q2.tail=1;
#初始化棧s為空,最開始的時候桌上也沒有牌
s.top=
0;
#先讀入6張牌,放入小a手上
for(i=
1;i<
6;i++
)//再讀入6張牌,放到小b手中
for(i=
1;i<
6;i++
)
下面就是需要將桌子上面的每一張牌進行列舉看是否與2人的牌一樣,進行對比,下面就直接上全部的**啦~~~
#include
struct queue
;struct stack
;int
main()
//小b手上的6張牌
for(i=
1;i<=
6;i++
)while
(q1.head//當佇列不為空的時候執行迴圈
else
book[s.data[s.top]]==
0;q1.data[q1.tail]
=s.data[s.top]
; q1.tail++
; s.top--;}
if(q1.head==q1.tail)
break
;//小a手中的牌如果已經打完,遊戲結束
t=q2.data[q2.head]
;//小b 出一張牌
//判斷小b當前打出的牌是否能夠贏牌
if(book[t]==0
)//表明桌上麼有牌面為t的牌
else
//收回桌上牌面為t的牌
book[s.data[s.top]]==
0;q2.data[q2.tail]
=s.data[s.top]
; q2.tail++
; s.top--;}
}if(q2.head==q2.tail)
else
print
("\n桌上已經麼有牌了");
}else
else
print
("\n桌上已經沒有牌了");
}getchar()
;getchar()
;return0;
}
可以輸入以下資料進行驗證:
2 4 1 2 5 6
3 1 3 5 6 4
執行結果是:
小bwin
小b當前手中的牌是 1 6 5 2 3 4 1
桌上的牌是 3 4 5 6 2
大家快去試試吧~~,看看有沒有更方便的方法可以解決這個問題,歡迎來交流呀!!!
紙牌遊戲 小貓釣魚
小貓釣魚 遊戲規則 將一副撲克牌平均分成兩份,每人拿乙份。小哼先拿出手上的第一張撲克牌放在桌子上,然後小哈也拿出手上的第一張撲克牌,放在小哼剛打出的牌上面,就這樣兩人交替出牌。出牌時,如果某人打出的牌與桌上的牌的牌面相同,即可將兩張相同的牌及其中間所加的牌全部取走,並依次放到自己手中牌的末尾,當任意...
紙牌遊戲 小貓釣魚
星期天小哼和小哈約在一起玩桌遊,他們正在玩乙個非常古怪的撲克遊戲 小貓釣魚 遊戲的規則是這樣的 將一副撲克牌平均分成兩份,每人拿乙份。小哼先拿出手中的第一張撲克牌放在桌上,然後小哈也拿出手中的第一張撲克牌,並放在小哼剛打出的撲克牌的上面,就像這樣兩人交替出牌。出牌時,如果某人打出的牌與桌上某張牌的牌...
紙牌遊戲 小貓釣魚
將一副撲克牌平均分成兩份,每人拿乙份。小哼先拿出手中的第一張撲克牌放在桌上,然後小哈也拿出手中的第一張撲克牌,並放在小哼剛打出的撲克牌的上面,就像這樣兩人交替出牌。出牌時,如果某人打出的牌與桌上某張牌的牌面相同,即可將兩張相同的牌及其中間所夾的牌全部取走,並依次放到自己手中牌的末尾。當任意一人手中的...