UVA 120 - Stacks of Flapjacks
输入数字是以回车结束每一行,注意只输入一个数字情况。感觉这道题答案应该不唯一。下面代码是从后往前搜索,如果在相应位置就过去;如果不在就交换到第0位置,然后在做一次交换到相应位置。
#include <stdio.h> #include <stdlib.h> #include <string.h> int cmp(const void *_a, const void *_b) { int* a = (int *)_a; int* b = (int *)_b; return *a - *b; } void swap(int a[], int i, int j) { while (i < j) { int tmp = a[i]; a[i] = a[j]; a[j] = tmp; i++; j--; } } int main() { int a[35], b[35], n; while (scanf("%d", &a[0]) != EOF) { // 接收输入的数字 n = 1; if (getchar() != '\n') while (scanf("%d", &a[n++])) if (getchar() == '\n') break; // 输出原先的序列并复制一份给b数组 for (int i=0; i<n; i++) { b[i] = a[i]; printf("%d ", a[i]); } printf("\n"); // 对b数组进行排序 qsort(b, n, sizeof (int), cmp); // 从后往前遍历a数组 for (int i=n-1; i>=0; i--) { // 如果a[i]的值在排好序的位置就不执行下面的for循环 if (a[i] == b[i]) continue; for (int j=i-1; j>=0; j--) { // 如果a[i]的值与位置不符就从前面找到该位置的数 if (b[i] == a[j]) { // 如果该数在第0个位置就直接交换 if (j == 0) { printf("%d ", n - i); swap(a, 0, i); } // 如果不在第0个位置就先交换到第0位置再交换到相应位置 else { printf("%d ", n - j); swap(a, 0, j); printf("%d ", n - i); swap(a, 0, i); } } } } printf("0\n"); } return 0; }