摘要: 把整数1,2,3...n组成一个环, 相邻两环之和为素数, 每种环输出一次.1. 穷举所有排列. 排列总数为n!个.当n取17时, 运算结果如下:total: 0. with running time: 3.994225 sec.已经有些吃力了Orz...(代码有点啰嗦, 这里可以直接使用next_permutation()来实现)额..后来发现这个属于回溯.#define S 17int total = 0;int N[S] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};int C[S] = {0};bool isPrime(int n) { . 阅读全文
posted @ 2012-12-07 15:54 tsubasa_wp 阅读(207) 评论(0) 推荐(0) 编辑
摘要: 回溯法, 全排列生成问题, 枚举量不超过 n! 个.#define S 4int n = S;int tot = 0;int C[S] = {0};void m_search(int cur) { if ( cur == n ) { tot += 1; for ( int i = 0; i < n; i++ ) printf("%d ", C[i]); printf("\n"); return; } for ( int i = 0; i < n; i++ ) { int ok = 1; C[cur] = i... 阅读全文
posted @ 2012-12-07 12:28 tsubasa_wp 阅读(172) 评论(0) 推荐(0) 编辑
摘要: 1. 增量构造法。 假设给出的数组是有序且无重复的。void print_subset(int n, int *a, int cur) { for ( int i = 0; i < cur; i++ ) printf("%d ", a[i]); printf("\n"); int s = cur ? a[cur - 1] + 1 : 0; // 这句重要。用到了定序技巧, 规定集合a中元素编号从小到大排列。 for ( int i = s; i < n; i++ ) { a[cur] = i; print_subset(n, a, ... 阅读全文
posted @ 2012-12-06 23:30 tsubasa_wp 阅读(212) 评论(0) 推荐(0) 编辑
摘要: #define L 5int N[L] = {1,2,3,4,5};void print_permutation(int n, int *a, int cur) { if ( cur == n ) { for ( int i = 0; i < n; i++ ) { printf("%d ", a[i]); } printf("\n"); } else { for ( int i = 0; i < n; i++ ) { int has = 0; for ( ... 阅读全文
posted @ 2012-12-06 17:14 tsubasa_wp 阅读(302) 评论(0) 推荐(0) 编辑
摘要: 找一条从起点到终点的最短移动序列。首先计算出起点到每个节点的最短距离(未完待续)#define SIZE 6int mat[SIZE][SIZE], vis[SIZE][SIZE];int que[SIZE*SIZE][2];int addNode(int x0, int y0, int x, int y, int rear) { if (( x < 0 ) || ( y < 0 ) || ( x >= SIZE ) || ( y >= SIZE )) return rear; if (( mat[x][y] < 0 )||( vis[x][y])) return 阅读全文
posted @ 2012-12-05 22:55 tsubasa_wp 阅读(1711) 评论(0) 推荐(0) 编辑
摘要: 输入一个n*n的黑白图像,(1表示黑色,0表示白色),统计其中相连块的个数。例如:100100001010000000110000111000010100上面矩阵所示图形中有3块黑色图像。解答: 用递归求解。从每个未被访问过的黑格子除法, 递归访问所有相连的八个黑格子。#define SIZE 6int mat[SIZE][SIZE], vis[SIZE][SIZE];void dfs( int x, int y) { if (( x < 0 ) || ( y < 0 ) || ( x >= SIZE ) || ( y >= SIZE )) return; if (( 阅读全文
posted @ 2012-12-05 21:55 tsubasa_wp 阅读(255) 评论(0) 推荐(0) 编辑
摘要: void build(int n, char*s1, char*s2, char*s) { if (n<=0) return; int p = strchr(s2, s1[0]) - s2; build(p, s1 + 1, s2, s); build(n-p-1, s1 + p + 1, s2 + p + 1, s + p); s[n-1] = s1[0];}int main () { char s1[100], s2[100]; while(scanf("%s%s", s1, s2) == 2) { int n = strlen(s... 阅读全文
posted @ 2012-12-05 21:26 tsubasa_wp 阅读(175) 评论(0) 推荐(0) 编辑
摘要: typedef struct TNode{ int have_value; int v; struct TNode *left, *right;} Node;Node *root;Node* newNode() { Node *u = (Node *)malloc(sizeof(Node)); if ( u != NULL ) { u -> have_value = 0; u -> left = u -> right = NULL; } return u;}void addNode( int v ) { Node *n... 阅读全文
posted @ 2012-12-05 15:54 tsubasa_wp 阅读(221) 评论(0) 推荐(0) 编辑
摘要: CHAR_BIT: 8CHAR_MAX: 127CHAR_MIN: -128SCHAR_MAX: 127SCHAR_MIN: -128UCHAR_MAX: 255SHRT_MAX: 32767SHRT_MIN: -32768USHRT_MAX: 65535INT_MAX: 2147483647INT_MIN: -2147483648UINT_MAX: 4294967295LONG_MAX: 9223372036854775807LONG_MIN: -9223372036854775808ULONG_MAX: 18446744073709551615LLONG_MAX: 9223372036.. 阅读全文
posted @ 2012-12-05 10:18 tsubasa_wp 阅读(2646) 评论(0) 推荐(0) 编辑
摘要: void merge( vector<int> &v1, int low, int mid, int high ) { vector<int> v2(L); int i = low, j = mid + 1, k = low; while ( i <= mid && j <= high ) { if ( v1[i] <= v1[j] ) { v2[k++] = v1[i++]; } else { v2[k++] = v1[j++]; } } while ( i <= mid ) ... 阅读全文
posted @ 2012-12-03 10:54 tsubasa_wp 阅读(166) 评论(0) 推荐(0) 编辑