迴圈連結串列之魔術撲克
阿新 • • 發佈:2018-12-11
【問題描述】
13 張黑桃撲克(A 2 3 4 5 6 7 8 9 10 J Q K),預先排好,正面朝下拿在魔術師的手裡,從最上面開始,第一次數一張牌翻過來放在桌面上,正好是“A”;第二次數兩張牌,數1 的那張放在手中撲克的最下面,數2 的那張翻過來放在桌面上正好是“2”;第三次數三張牌,數1 的那張放在手中撲克的最下面,數2 接著放在下面,數3 的那張翻過來放在桌面上正好是“3”;.……,如此下去,放在桌面上的牌最後正好是“A 2 3 4 5 6 7 8 9 10 J Q K”的順序(從下向上)。
【任務】程式設計找出魔術師手中撲克原來的排列順序(從下向上)。
思路:順著原操作用迴圈連結串列模擬這個過程。可以用一個標誌量flag,當這張牌被抽出來時候,它就變化狀態,下次數牌的時候就不數它。每次抽出一張的牌意思就是按順序(
#include <iostream> using namespace std; //為了方便直接public class Node { public: int flag; char data; Node() { flag=1; } }; int main() { Node a[13]; //按順序賦值的陣列 char poker[13]={'A','1','2','3','4','5','6','7','8','9','J','Q','K'}; //賦值下標 int index=0; //數幾張牌的控制量 int count=0; //位置:數n張牌的第n張的下標 int place=0; while(index<13) { int i=0; while(i<=count) { //是沒有被抽出的牌才數 if(a[place].flag) { if(i==count) break; i++; } //陣列迴圈移動 if(place==12) place=0; else place++; } count++; a[place].data=poker[index++]; a[place].flag=0; if(place==12) place=0; else place++; } for(int i=0;i<13;i++) cout<<i<<" "<<a[i].data<<endl; return 0; }