1. 程式人生 > >演算法競賽入門經典:第六章 資料結構基礎 6.1卡片遊戲

演算法競賽入門經典:第六章 資料結構基礎 6.1卡片遊戲

/*
卡片遊戲:
桌上有一疊拍,從第一張牌(位於頂面的牌)開始從上往下依次編號為1~n。當至少還剩兩張牌時進行以下操作:把第一張牌扔掉,然後把新的第一張放到整疊牌
的最後。輸入n,輸出每次扔掉的牌,以及最後剩下的牌

思路:
設定剪枝陣列,凡是扔掉的牌,置剪枝標記為真,迴圈結束條件為還剩一張牌,有兩個迴圈:報數迴圈,每次報到的刪除,大迴圈,每次超過7進入下一次迴圈
關鍵:如何解決放在末尾的問題?用迴圈連結串列,每次放在後面。凡是放在後面,再為它開闢一個數組元素
用連結串列,找到末尾位置之後,從前向後遍歷,如果是新1,則在末尾後加上新1,一直到只剩一個元素位置,採用尾插法
首先建立單鏈表n
用佇列也可以做,前面彈出元素,後面末尾追加元素
*/

#include <stdio.h>
#include <stdlib.h>
#include <queue>

#define MAXSIZE 1024

using namespace std;



void cardGame(int n)
{
	queue<int> queueIntCard;
	for(int i = 1 ; i <= n;i++)
	{
		queueIntCard.push(i);
	}
	while(!queueIntCard.empty())
	{
		printf("%d ",queueIntCard.front());
		queueIntCard.pop();
		if(queueIntCard.empty())
		{
			break;
		}
		queueIntCard.push(queueIntCard.front());
		queueIntCard.pop();
		/*程式碼太煩,簡化
		int iDel = queueIntCard.front();
		printf("%d ",iDel);
		queueIntCard.pop();
		if(queueIntCard.empty())
		{
			break;
		}
		int iMove = queueIntCard.front();
		queueIntCard.pop();
		queueIntCard.push(iMove);
		*/
	}
}


void cardGame(int n,int i)
{
	int m_queue[MAXSIZE];
	int front = 0,rear = n;//關鍵,模擬佇列,設定隊首和隊尾
	for(int i = 0; i < n;i++)
	{
		m_queue[i] = i+1;
	}
	while(front < rear)
	{
		printf("%d ",m_queue[front++]);
		m_queue[rear++] = m_queue[front++];//這個經典,將隊尾累加隊守元素,不需要設定剪枝陣列
	}
}

int main(int argc,char* argv[])
{
	int n;
	while(EOF != scanf("%d",&n))
	{
		cardGame(n,1);
	}	
	system("pause");
	return 0;
}

相關推薦

演算法競賽入門經典 資料結構基礎 6.1卡片遊戲

/* 卡片遊戲: 桌上有一疊拍,從第一張牌(位於頂面的牌)開始從上往下依次編號為1~n。當至少還剩兩張牌時進行以下操作:把第一張牌扔掉,然後把新的第一張放到整疊牌 的最後。輸入n,輸出每次扔掉的牌,以及最後剩下的牌 思路: 設定剪枝陣列,凡是扔掉的牌,置剪枝標記為真,迴圈

演算法競賽入門經典思考題

題目1(必要的儲存量) 陣列可以用來儲存很多資料,但在一些情況下,並不需要把資料儲存下來。下面哪些題目可以不借助陣列,哪些必須藉助陣列?請程式設計實現。假設輸入只能讀一遍。 1. 輸入一些數,統計個數。 2. 輸入一些數,求最大值、最小值和平均數。 3.

算法競賽入門經典題解—— 3-3數數字 UVa1225

() %d 入門 scan clu amp uva ++ tdi 我的思路是打表,但不一次性打出所有。目前已經計算出的最大n標記為max,假如一次輸入為n=13,就把n=max+1到13的結果都儲存到二維數組中。max初始為0 坑:每行輸出末尾不能有空格,但必須換行(包括最

算法競賽入門經典題解—— 3-4 周期串UVa455

() sca clas pan 可能 span amp tdi ++ 思路:遍歷可能的周期,比較s[k]與s[k%i](其中i為周期) #include <stdio.h> #include <stdlib.h> #include<str

演算法競賽入門經典2版)紫書

紫書 第3章陣列和字串(例題) 例題3-1 TEX Quotes 例題3-2 WERTYU 例題3-3 Palindromes 例題3-4 Master-Mind Hints 例題3-5 Digit Generator 例題3-6 Circular Sequence 紫書

演算法競賽入門經典2版)救濟金髮放(The Dole Queue,UVa133)

演算法競賽入門經典(第2版)救濟金髮放(The Dole Queue,UVa133 import java.util.Scanner; /** * @author Joker */ publ

演算法競賽入門經典習題2-6排列

        嘛...題目就是1-9,九個數字,每個數字只能用一次,組成三個三位數,要求三個數的比為1:2:3。        暴力迴圈直接就可以過的~        PS:書上提示說這個題不用太動腦

演算法競賽入門經典2版)習題4-3 黑白棋 Othello UVa220

這題邏輯和習題4-1象棋很相似,沒什麼特別的。 第一次提交報wa,添加了若干樣例測試,發現邏輯無誤。 與樣例輸出對拍後發現輸出尾部多了一個換行符,修改後ac。 //#define LOCAL //#define TESTING #include<stdio.h>

演算法競賽入門經典2版)習題3-4 週期串 Periodic Strings UVa445

這題把我虐哭了。 提交了13次才ac。 演算法本身沒什麼好說的,UVa上html版和pdf版的輸入輸出格式要求不一樣,以html版為準。 而且html版的輸入輸出格式都有點奇葩,不認真看原文細節是ac不了的。 參考了他的例程,我才找到問題的解決辦法。 UVa評測系統中的空

演算法競賽入門經典2版)習題4-5 IP網路 IP Networks UVa1590

這道題的邏輯很簡單,讀入所有的ip地址,確認總共32位二進位制數中最左一個不同是在哪裡出現的,然後按規則輸出網路地址與子網掩碼即可。 可上傳後我發現它就是wa...還是wa...總是wa...... 然後我在網上找到了例程,設想出了很多測試資料,用fc拍來拍去,總是報告“找

演算法競賽入門經典】【第一】課後習題

今天心血來潮,決定將《演算法競賽入門經典》裡面的課後題,進行詳解,先來第一發。 習題1-1 平均數(average)        對於第一題,相信即便是第一次接觸程式設計的人。只要稍稍瞭解一下C的語法,也可輕易解決這一題。所以我也不多說了直接上程式碼。 #include

演算法競賽入門經典2版)習題3-5 謎題(Puzzle) Uva227

C++編寫 #include<iostream> using namespace std; int main() { int x = 2, y = 1; char Pu

演算法競賽入門經典2版)習題4-5 IP網路UVa1590

#include <stdio.h> #include <string.h> int twoip[1005][35]; void changetwo(int num, int i, int j) { int q, chu = num; //printf("%d %d %d\n",

UVa220 演算法競賽入門經典2版)習題4-3 黑白棋 Othello

 老規則   題目解釋看他們的  程式碼看我的。。         可能我的程式碼略微濃縮一些。  。。 。。我找了半天,,程式碼寫的都好長。,要是看懂了題目的話 就看我的程式碼吧。 http://blog.csdn.net/kyoma/article/details/51

演算法競賽入門經典習題3-8 手機鍵盤(keyboard)

輸入一個由小寫字母組成的英文單詞,輸出用手機的預設英文輸入法的敲鍵序列。例如要打出pig這個單詞,需要按1次p,3次i,(稍作停頓後)1次g,記為p1i3g1。 #include<stdio.h> #include<string.h> #define

八節課儲存結構與磁碟劃分

 筆記 (借鑑請修改) 6.3、檔案系統與資料資料         目前linux最常見的檔案系統:         ext3:日誌檔案系統。宕機時可自動恢復資料資料,容量越大恢復時間越長,且不能保證百分百不

解析幾何 二次曲面(1)球面 橢球面 雙曲面

§1.球面 1.球面方程,球心與半徑 圖形 方程 球心和半徑    1° 標準方程: x²+y²+z²=R² 2° 引數方程 (φ為經度,θ為緯度) 3° 球面座標方程 r=R 球心:G(0,0,0) 半徑:R 1° (x-a)²+(y-b)²

演算法競賽入門經典例題6-1 Concurrency Simulator UVA

#include<iostream> #include<string> #include<deque> #include<vector> #inclu

演算法競賽入門經典(第二版)陣列和字串習題3-4週期串

如果一個字串可以由某個長度為k的字串重複多次得到,則稱該串以k為週期。例如abcabcabc以3為週期(注意,它也以6和12為週期)。輸入一個長度不超過80的字串,輸出其最小週期 #include<stdio.h> int main() { char a[100];

演算法競賽入門經典(第二版)陣列和字串習題3-3數數字

把前n(n<=10000)個整數順次解除安裝一起:123456789101112…數一數0~9各出現多少次(輸出10個整數,分別是0,1,…,9出現的次數) #include<stdio.h> #define N 100000 char s[N],temp[10]; i