NYOJ
//http://acm.nyist.net/JudgeOnline/problem.php?pid=33
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int *a; int row, tmp_row; int num = 1; int i, j; int loc; scanf("%d", &row); i = 0; j = row - 1; tmp_row = row; a = (int *)malloc(row*row*sizeof(int)); memset(a, 0, row*row*sizeof(int)); while (tmp_row) { //蛇向下移动。 while (i < tmp_row) { //判断蛇是否在可用的行内。不符和条件,证明本方向移动结束 loc = i* row + j; if (*(a + loc)) { i--; break; }//判断位置是否已经被蛇占用了,占用,证明本方向移动结束 *(a + loc) = num++; i++;//对行数加一,移动到下一个位置 } if (i >= tmp_row) i--;//如果移动出可用行,返回行内 j--;//因为返回的位置,此位置已经被使用过。通过j--修正到正确的位置,下面同理 while (j >= 0) { loc = i* row + j; if (*(a + loc)) { j++; break; } *(a + loc) = num++; j--; } if (j < 0) j++; i--; while (i >= 0) { loc = i* row + j; if (*(a + loc)) { i++; break; } *(a + loc) = num++; i--; } if (i < 0) i++; j++; while (j <tmp_row) { loc = i* row + j; if (*(a + loc)) { j--; break; } *(a + loc) = num++; j++; } i++; tmp_row--; } loc = 0; for (i = 0; i < row; i++) { for (j = 0; j < row; j++) { printf("%d ", *(a + loc)); loc++; } printf("\n"); } return 0; }
//http://acm.nyist.net/JudgeOnline/problem.php?pid=63 #include <stdio.h> #include <string.h> #include <math.h> int visit[1000010]; #define init(arr, value) memset(arr, value, sizeof(arr)) #define max(a, b) return a > b ? a : b int main() { int deep, node, num, i, k; //deep为二叉树的深度 while (scanf("%d%d", &deep, &num) && deep && num) { init(visit, 0); node = pow((double)2, deep) - 1; //结点个数 for (int i = 1; i <= num; ++i) { k = 1; while (true) { visit[k] = !visit[k]; if (visit[k]) { k = k * 2; //左孩子 } else { k = k * 2 + 1; //右孩子 } if (k > node) { break; } } } printf("%d\n", k / 2); //k为叶子结点的左孩子,所以除2 } return 0; }
//http://acm.nyist.net/JudgeOnline/problem.php?pid=117 //http://blog.csdn.net/dlengong/article/details/7594919 逆序数的求法~~