//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("
");
}
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
", k / 2); //k为叶子结点的左孩子,所以除2
}
return 0;
}
//http://acm.nyist.net/JudgeOnline/problem.php?pid=117
//http://blog.csdn.net/dlengong/article/details/7594919
逆序数的求法~~