您的位置:首页 > 其它

uva - 120 - Stacks of Flapjacks

2014-02-02 22:21 387 查看
//#define Local
#include <iostream>
#include <cstring>
#include <stdio.h> 
#include <stdlib.h> 
using namespace std;

#define MAX 1000

struct Array
{
	int num[MAX];
	int len;
};

void Change (Array *flap, Array *sorted, char s[])
{
	int j = 0, k = 0;
	char temp[MAX];
	for (int i = 0; i <= strlen(s); i++)	//这地方用了 <= 要注意,因为要取到‘\0’
	{
		if (s[i] == ' ' || s[i] == '\0')//等于空格,转化前边储存的temp。字符串最后是\0,写成了\n,所以最后一个数转换不了
		{
			(*flap).num[k] = atoi(temp);
			(*sorted).num[k] = atoi(temp);
			k++;
			memset(temp, '\0', sizeof(temp));
			j = 0;
		}
		else
			temp[j++] = s[i];
	}
	(*flap).len = (*sorted).len = k;	//长度写错过,改了以后是等于k,不是j
}

int Search (Array flap, int a)
{
	for (int i = 0; i < flap.len; i++)
		if (flap.num[i] == a)
			return i;
	return 0;
}

int cmp(const void *a, const void *b)
{
	return *(int*)a - *(int*)b;
}

void swap (int *a, int *b)
{
	int temp = 0;
	temp = *a;
	*a = *b;
	*b = temp;
}

void fips (Array *flap, int pos)
{
	int head = 0;
	for (int i = pos; i >= pos - pos/2; i--)
		swap(&(*flap).num[i], &(*flap).num[head++]);
}

int main()
{
#ifdef Local
	freopen("a.in", "r", stdin);
	freopen("a.out", "w", stdout);
#endif
	Array flap = {0, 0}, sorted = {0, 0};
	int i = 0, pos = 0;
	char s[MAX];
	while (gets(s) != NULL)
	{
		puts(s);
		Change(&flap, &sorted, s);	//转换输入
		qsort(sorted.num, sorted.len, sizeof(int), cmp);//快速排序, qsort应该写sorted.len,写了个len
		for (i = sorted.len-1; i >= 0; i--)
		{
			if (flap.num[i] != sorted.num[i])	//不在应该在的位置上,要进行翻转
			{
				pos = Search(flap, sorted.num[i]);//在flap中查找sorted[i]的位置
				if (pos != 0)	//不在顶上,在顶上上的话不用翻到顶上了
				{
					fips(&flap, pos);//把要找的元素翻到最顶上
					cout << sorted.len-pos << ' ';
				}
				fips(&flap, i);//在把它翻到应该的位置上。
				cout << sorted.len-i << ' ';
			}
		}
		cout << '0' << endl;
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: