UVa Problem 10152 ShellSort (龟壳排序)
2011-05-27 16:12
375 查看
// ShellSort (龟壳排序) // PC/UVa IDs: 110407/10152, Popularity: B, Success rate: average Level: 2 // Verdict: Accepted // Submission Date: 2011-05-27 // UVa Run Time: 0.656s // // 版权所有(C)2011,邱秋。metaphysis # yeah dot net // // 如何移动才能实现最少移动步骤?这个问题花费了我一些时间去思考。考虑如下一个初始状态和最终 // 状态(为了解释方便,在乌龟的名字前面用方括号标记了序号): // // 初始状态: 最终状态: // [4]Yertle [1]Oscar // [1]Oscar [2]Baron // [2]Baron [3]Lord // [3]Lord [4]Yertle // [5]King [5]King // [7]White [6]Kong // [6]Kong [7]White // // 可以通过如下六步达到目标,六步是所需最少步骤。 // // [4]Yertle [6]Kong [5]King // [1]Oscar [4]Yertle [6]Kong // [2]Baron [1]Oscar >>>>[4]Yertle // [3]Lord ==>> [2]Baron ==>> [1]Oscar ==>> // [5]King [3]Lord [2]Baron // [7]White >>>>[5]King [3]Lord // >>>>[6]Kong [7]White [7]White // // [4]Yertle [3]Lord [2]Baron // [5]King [4]Yertle [3]Lord // [6]Kong [5]King [4]Yertle // [1]Oscar ==>> [6]Kong ==>> [5]King ==>> // [2]Baron [1]Oscar [6]Kong // >>>>[3]Lord >>>>[2]Baron >>>>[1]Oscar // [7]White [7]White [7]White // // // [1]Oscar // [2]Baron // [3]Lord // [4]Yertle // [5]King // [6]Kong // [7]White // // 算法如下:假设有 n 只乌龟,编号为 1 ~ n,对于编号为 n 的乌龟,如果编号为 n - 1 的乌龟在 // 编号为 n 的乌龟的下方,将编号为 n - 1 的乌龟放到顶端,然后对编号为 n - 1,n - 2,... , // 2,1 的乌龟继续以上操作,直到排序完毕。 #include <iostream> using namespace std; #define MAXSIZE 200 #ifndef DEBUG_MODE //#define DEBUG_MODE #endif struct turtle { string name; int index; }; void shell_sort(turtle start[], turtle last[], int capacity) { // 为初始状态的乌龟赋予序号。 for (int i = 0; i < capacity; i++) for (int j = 0; j < capacity; j++) if (start[j].name == last[i].name) { start[j].index = last[i].index; break; } // 对初始乌龟状态排序。 for (int i = capacity; i > 1; i--) { // 找到序号为i和(i - 1)的两只乌龟在数组的位置。 int current, previous; for (int j = 0; j < capacity; j++) { if (start[j].index == i) current = j; if (start[j].index == (i - 1)) previous = j; } // 如果序号为(i - 1)的乌龟在序号为i的乌龟的下方,则将其放到顶端。 if (previous > current) { cout << start[previous].name << endl; turtle tmp = start[previous]; for (int j = previous; j > 0; j--) { start[j].name = start[j - 1].name; start[j].index = start[j - 1].index; } start[0].name = tmp.name; start[0].index = tmp.index; } #ifdef DEBUG_MODE cout << "<Debug Begin>" << endl; for (int j = 0; j < capacity; j++) cout << start[j].index << " " << start[j].name << endl; cout << "<Debug End>" << endl; #endif } } int main(int ac, char *av[]) { int cases, capacity; turtle start[MAXSIZE]; turtle last[MAXSIZE]; cin >> cases; while(cases--) { cin >> capacity; cin.ignore(); // 读入初始状态。 for (int i = 0; i < capacity; i++) getline(cin, start[i].name); // 读入最终状态,并赋予每只乌龟序号。 for (int i = 0; i < capacity; i++) { getline(cin, last[i].name); last[i].index = (i + 1); } // 开始龟壳排序! shell_sort(start, last, capacity); cout << endl; } return 0; }
相关文章推荐
- UVa Problem 10152 ShellSort (龟壳排序)java实现
- uva 10152 ShellSort 龟壳排序(希尔排序?)
- UVa OJ ShellSort 10152 龟壳排序
- Uva 10152 - ShellSort//排序,线性表
- UVa 10152 - ShellSort 龟壳排序
- uva 10152 ShellSort 龟壳排序(希尔排序?)
- uva 10152 ShellSort 解题报告
- UVa 10152 ShellSort解题报告
- UVA 10152-ShellSort(映射+栈)
- UVa 10152 - ShellSort 数据结构专题
- UVA - 10152 ShellSort
- uva 10152 ShellSort
- UVa-10152 ShellSort(模拟)
- UVa 10152 - ShellSort
- uva10152(shellsort)—线性表
- UVa 10152 - ShellSort 题解
- (字符串的映射与匹配7.3.13)UVA 10152 ShellSort(将初始序列转化成目标序列所需的最少次数,前提条件是:每一个元素只能移动栈顶)
- ShellSort UVA10152
- uva 10152 ShellSort(模拟)
- UVa12210 - A Match Making Problem(排序)