1. 程式人生 > >迴圈連結串列之魔術撲克

迴圈連結串列之魔術撲克

問題描述

13 張黑桃撲克(A 2 3 4 5 6 7 8 9 10 J Q K),預先排好,正面朝下拿在魔術師的手裡,從最上面開始,第一次數一張牌翻過來放在桌面上,正好是“A”;第二次數兩張牌,1 的那張放在手中撲克的最下面,數2 的那張翻過來放在桌面上正好是“2”;第三次數三張牌,的那張放在手中撲克的最下面,數2 接著放在下面,數3 的那張翻過來放在桌面上正好是“3;.……,如此下去,放在桌面上的牌最後正好是“A 2 3 4 5 6 7 8 9 10 J Q K”的順序(從下向上)。

任務程式設計找出魔術師手中撲克原來的排列順序(從下向上)

思路:順著原操作用迴圈連結串列模擬這個過程。可以用一個標誌量flag,當這張牌被抽出來時候,它就變化狀態,下次數牌的時候就不數它。每次抽出一張的牌意思就是按順序(

A 2 3 4 5 6 7 8 9 10 J Q K)給它賦值,第一次抽出放在的是A,第二次抽出放在桌子上的是2,第三次是3......

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