實驗2.2 線性表的應用:遊戲

安如少年夢如初發表於2020-11-11

實驗2.2 線性表的應用:遊戲

[問題描述]

基於STL實現以下功能:有n個小朋友圍成一圈玩遊戲,小朋友從1至n編號,2號小朋友坐在1號小朋友的順時針方向,3號小朋友坐在2號小朋友的順時針方向,……,1號小朋友坐在n號小朋友的順時針方向。

遊戲開始,從1號小朋友開始順時針報數,接下來每個小朋友的報數是上一個小朋友報的數加1。若一個小朋友報的數為k的倍數或其末位數(即數的個位)為k,則該小朋友被淘汰出局,不再參加以後的報數。當遊戲中只剩下一個小朋友時,該小朋友獲勝。
  例如,當n=5, k=2時:
  1號小朋友報數1;
  2號小朋友報數2淘汰;
  3號小朋友報數3;
  4號小朋友報數4淘汰;
  5號小朋友報數5;
  1號小朋友報數6淘汰;
  3號小朋友報數7;
  5號小朋友報數8淘汰;
  3號小朋友獲勝。

給定n和k,請問最後獲勝的小朋友編號為多少?

[輸入形式]

輸入一行,包括兩個整數n和k,意義如題目所述。

[輸出形式]

輸出一行,包含一個整數,表示獲勝的小朋友編號。

問題分析

要處理的物件(資料):

通過鍵盤輸入的兩個整數n和k,以整型的形式儲存到計算機中,利用STL中的queue容器進行後續操作

要實現的功能:

利用STL模板,選擇一個容器,建立一個從元素值從1到n有n個整數的queue容器,
利用迴圈,進行入隊出隊操作,直到容器中只剩下一個元素。

處理後的結果如何顯示:

將剩下的最後一個元素的值輸出在螢幕上

輸入樣例

【求解方法】

建立一個從元素值從1到n有n個整數的queue容器,利用迴圈,做隊頭出隊操作
並記錄下出隊的元素值,如果是k的倍數或者數的個位為k則不再入隊,否則將其
插入隊尾,迴圈到只剩一個元素則截止。

【樣例求解過程一】

1.輸入兩個整數: 5 2
2.建立一個從元素值從1到5的queue容器:1 2 3 4 5
3.利用迴圈迴圈開始做出隊入隊操作:
    2 3 4 5 1-1
    3 4 5 1-2
    4 5 1 3-3
    5 1 3-4
    1 3 5-5
    3 5-6
    5 3-7
    3-8
4.輸出剩餘最後一個元素的值:3

【樣例求解過程二】

1.輸入兩個整數: 7 3
2.建立一個從元素值從7到3的queue容器:1 2 3 4 5 6 7
3.利用迴圈迴圈開始做出隊入隊操作:
    2 3 4 5 6 7 1-1
    3 4 5 6 7 1 2-2
    4 5 6 7 1 2-3
    5 6 7 1 2 4-4
    6 7 1 2 4 5-5
    7 1 2 4 5-6
    1 2 4 5 7-7
    2 4 5 7 1-8
    4 5 7 1-9
    5 7 1 4-10
    7 1 4 5-11
    1 4 5-12
    4 5-13
    5 4-14
    4-15
4.輸出剩餘最後一個元素的值:4

物理資料物件設計

物理儲存方式: 整型

演算法思想的設計:

建立一個從元素值從1到n有n個整數的queue容器,利用迴圈,做隊頭出隊操作
並記錄下出隊的元素值,如果是k的倍數或者數的個位為k則不再入隊,否則將其
插入隊尾,迴圈到只剩一個元素則截止。

關鍵功能的演算法步驟:

建立一個從元素值從1到n有n個整數的queue容器:

    for(int i=1;i<=n;i++) 
    {
        v.push(i); //把i插入隊尾
    }

時間複雜度O(n),空間複雜度O(n)

入隊出隊操作:

    while(v.size() > 1)
	{
		int t = v.front(); //記錄下要出隊的元素的值
		v.pop(); //隊頭出隊
		if( !( num%k == 0 || num%10 == k) ) v.push(t); //不是k的倍數或者數的個位為k則入隊
		num++; 
	}

時間複雜度為:O(kn),空間複雜度為θ(n)

實驗程式碼

#include<iostream>
#include<queue>
using namespace std;
int main()
{
	int n,k;
	cin>>n>>k;
	queue <int> v;
	for(int i=1;i<=n;i++) 
	{
		v.push(i);
	}
	int num = 1;
	while(v.size() > 1)
	{
		int t = v.front();
		v.pop();
		if( !( num%k == 0 || num%10 == k) ) v.push(t);
		num++;
	}
	cout<<v.front()<<endl;
}

相關文章