卡片遊戲

親愛的張小語發表於2017-08-02

卡片遊戲

問題描述 :

  小明最近宅在家裡無聊,於是他發明了一種有趣的遊戲,遊戲道具是N張疊在一起的卡片,每張卡片上都有一個數字,數字的範圍是0~9,遊戲規則如下:
  首先取最上方的卡片放到桌子上,然後每次取最上方的卡片,放到桌子上已有卡片序列的最右邊或者最左邊。當N張卡片全部都放到桌子上後,桌子上的N張卡片構成了一個數。這個數不能有前導0,也就是說最左邊的卡片上的數字不能是0。遊戲的目標是使這個數最小。
  現在你的任務是幫小明寫段程式,求出這個最小數。

輸入:

第一行是一個數T,表示有T組測試資料;
然後下面有T行, 每行是一個只含有0~9的字串,表示N張疊在一起的卡片,最左邊的數字表示最上方的卡片。

[Technical Specification]
T<=1000
1 <= N <= 100

輸出:

第一行是一個數T,表示有T組測試資料;
然後下面有T行, 每行是一個只含有0~9的字串,表示N張疊在一起的卡片,最左邊的數字表示最上方的卡片。

[Technical Specification]
T<=1000
1 <= N <= 100

樣例輸入:

3
565
9876543210
9876105432

樣例輸出:

556
1234567890
1678905432

/*
分析:
    毫無疑問的,越是位數高的數字、其數值越小越好。
    就是先找到非0的、最小的、在字串中最靠後的數字,這個數
    就是ans的第一位了,再在原字串中這個數的左邊查詢最小值,

   排在ans後面,而原字串中這個數的右邊的數保持不動。

*/

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 105;
int l, r;
char str[N], ans[N];
void find(int a, int b)
{
	if (b < a)	return;
	int  index;
	char min;
	min = '9' + 1;
	for (int i = b; i >= a; i--)	if (str[i]<min)	{ min = str[i]; index = i; }
	for (int i = b; i>index; i--)	//補上右邊的數
		ans[r--] = str[i];	
	ans[l++] = str[index];			//補上左邊的數
	find(a, index - 1);
}
int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		int i;
		int index, len;
		char min;
		scanf("%s", str);
		len = strlen(str);
		min = '9' + 1;
		for (i = len - 1; i >= 0; i--)			
		{
			if (str[i] == '0')	continue;
			if (str[i]<min)	{ min = str[i]; index = i; }
		}
		if (min == '9' + 1)
		{
			while (len--)	printf("0");
			cout << endl;
			continue;
		}
		l = 0; r = len - 1;
		ans[l++] = min;		
		for (i = len - 1; i>index; i--)	ans[r--] = str[i];		//補上右邊的數
		find(0, index - 1);
		for (i = 0; i < len; i++)	printf("%c", ans[i]);
		printf("\n");
	}
	return 0;
}


相關文章