问题描述:
n元一维向量旋转问题数将向量ab变为ba。如何将向量abc变为cba? (这对交换非相邻内存块问题进行了建模)
问题解析:
1、这里需要用到一个重要的性质:CBA=(ArBrCr)r 如果想到这个性质,那么基本上问题就解决一半了!解决方案可以类似于QusetionB的解决方案3,见:
解决方案:
如果n=12, A = abc, B = de, C = fghijkl 那么有举例如下:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
#include <cstdio>
#include <cstdlib> // srand, rand #include <cassert> // assert /************************************************************************/ // 函数名称:myswap // 函数目的:反转arr索引在[index_a, index_b]之间的值 // 函数参数:arr:要交换的数组 arraysize:数组长度 index_a\index_b:数组索引 /************************************************************************/ void myswap( int* arr, int arraysize, int index_a, int index_b) { assert(index_a >= 0 && (index_b-index_a) >= 0 && index_b < arraysize); int i = index_a, j = index_b; for (; i <= j; i++, j--){ int temp = *(arr+i); *(arr+i) = *(arr + j); *(arr + j) = temp; } return; } int main() { int arr[ 12] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'}; int arraysize = 12; // 数组长度 //假设 n=12, A = abc, B = de, C = fghijkl 则可以如下进行 myswap(arr, arraysize, 0, 2); myswap(arr, arraysize, 3, 4); myswap(arr, arraysize, 5, 11); myswap(arr, arraysize, 0, 11); for ( int i = 0; i < 12; ++i) { printf( "%c\t", arr[i]); } return 0; } |
心得疑惑:
1、 一些数学的基本性质是解决实际问题算法的根本!