某一天張兵和小明在一起玩撲克牌,每個人各自拿取乙份撲克牌,張兵先把一張撲克牌放在桌子上,小明再放一張,出牌時
,如果某人打出的牌與桌上的某張牌的牌面相同,即可將兩張相同的牌及其之間所夾的牌全部取走,並依次放到自己手牌的
末尾,當任意一人的手牌全部出完後,遊戲結束,對手獲得勝利。
我們先來分析遊戲中的幾種操作,分別是出牌和贏牌,每個人的手牌可以設定成佇列結構,出牌時從佇列首彈出乙個元素,
贏牌時就將贏的牌插入佇列尾部。 桌子可設定成乙個棧的結構,兩人出的牌都進入棧中,當某個輸入的元素與棧中的
某乙個元素相同時,將這兩個元素及其之間的元素全部出棧,並且入勝利者的對列。
一 .首先設定資料結構,即兩個佇列乙個棧。
struct queue
;struct stack
;struct queue q1,q2;
struct stack s;
二.初始化佇列和棧
q1.head=
1; q1.tail=1;
q2.head=
1; q2.tail=1;
s.top=0;
//初始階段兩人手中都沒有牌,並且桌上也沒有牌。
三.給兩人新增手牌
for
(i=1
;i<=
10;i++
)for
(i=1
;i<=
10;i++
)
四.判斷過程
t=q1.data[q1.head]
;//打出一張牌
flag=0;
for(i=
1;i<=s.top;i++
)//列舉桌子上的牌逐一對比}if
(flag==0)
if(flag==1)
}
五.勝利條件判斷
while
(q1.head//兩人手牌都不為空則進行遊戲
六.演算法優化
判斷能否贏牌這個演算法要依次進行對比,複雜度高,我們可以開乙個陣列記錄桌子上已經有那些牌了,類似於桶排序的用法。
那麼**可以優化為:
int book[10]
;for
(i=1
;i<=
0;i++
)book[i]=0
;t=q1.data[q1.head];if
(book[t]==0
)
七.完整**
#include
struct queue
;struct stack
;int
main()
for(i=
1;i<=
10;i++
)while
(q1.headelse
book[s.data[s.top]
=s.data[s.top]
;//在收回另一張t牌
q1.tail++
; s.top--;}
if(q1.head==q1.tail)
break
;//張兵沒牌了,結束遊戲,後面是一樣的**,只是第二個人的過程
t=q2.data[q2.head]
;//小明出一張牌
if(book[t]==0
)else
book[s.data[s.top]
=s.data[s.top]
; q2.tail++
; s.top--;}
}if(q2.head==q2.tail)
printf
("張兵贏了"
); else
}
紙牌遊戲 小貓釣魚 棧與佇列合用實現
遊戲規則 將一副撲克牌平均分為兩份,每人拿乙份,a先拿出手中的第一張撲克牌放在桌上,然後b也拿出手中的第一張撲克牌,並放在a剛打出的撲克牌的上面,就像這樣兩人交替出牌.出牌時如果某人打出的牌與桌上某張牌的牌面相同時,即可將兩張相同的牌及其中間所夾的牌全部取走,並依次放到自己手中牌的末尾,當其中一人手...
紙牌遊戲 小貓釣魚
小貓釣魚 遊戲規則 將一副撲克牌平均分成兩份,每人拿乙份。小哼先拿出手上的第一張撲克牌放在桌子上,然後小哈也拿出手上的第一張撲克牌,放在小哼剛打出的牌上面,就這樣兩人交替出牌。出牌時,如果某人打出的牌與桌上的牌的牌面相同,即可將兩張相同的牌及其中間所加的牌全部取走,並依次放到自己手中牌的末尾,當任意...
紙牌遊戲 小貓釣魚
星期天小哼和小哈約在一起玩桌遊,他們正在玩乙個非常古怪的撲克遊戲 小貓釣魚 遊戲的規則是這樣的 將一副撲克牌平均分成兩份,每人拿乙份。小哼先拿出手中的第一張撲克牌放在桌上,然後小哈也拿出手中的第一張撲克牌,並放在小哼剛打出的撲克牌的上面,就像這樣兩人交替出牌。出牌時,如果某人打出的牌與桌上某張牌的牌...