1083 Cantor表&& 1160 蛇形矩阵

这种题目一般都是画出前进方向,然后找规律即可,要注意特殊情况的考虑

#include<stdio.h>
#include<stdlib.h>
int main() {
	int n,i,j,k,x,y,flag=0,sum=0;

	//建立动态数组
	scanf("%d",&n);
	int **a;
	a=(int**)malloc(sizeof(int*)*n);
	if(a==NULL) {
		printf("Out of memory!\n");
		exit(-1);
	}
	for(i=0; i<=n-1; i++) {
		a[i]=(int*)malloc(sizeof(int)*n);
		if(a[i]==NULL) {
			printf("Out of memory!\n");
			exit(-1);
		}
	}
	if(n==1)
		printf("1\n1");
	else {//根据→↑←←↓↓→→→↑↑↑←←←←↓↓↓↓→→→→ 找规律
		i=0;
		j=1;
		x=(n-1)/2;
		y=x;
		a[x][y]=j;//初始化到中央位置
		while(flag==0) {
			i++;
			for(k=1; k<=i; k++) {
				j++;
				y++;
				a[x][y]=j;
				if(x==n-1&&y==n-1) {
					flag=1;
					break;//最后一步在第一个循环里,做到两重跳出
				}
			}
			if(flag==1)
				break;
			for(k=1; k<=i; k++) {
				j++;
				x--;
				a[x][y]=j;
			}
			i++;
			for(k=1; k<=i; k++) {
				j++;
				y--;
				a[x][y]=j;
			}
			for(k=1; k<=i; k++) {
				j++;
				x++;
				a[x][y]=j;
			}

		}
		for(i=0; i<=n-1; i++) {
			for(j=0; j<=n-1; j++) {
				printf("%d ",a[i][j]);
				if(i==j||i+j==n-1)
				sum+=a[i][j];//对角线和
			}
			printf("\n");
		}
		printf("%d",sum);
	}
	return 0;
}
#include<stdio.h>
#include<stdlib.h>
int main() {
	int n,circle=1,j,k,count=1,x=1,y=1,flag=0;
	scanf("%d",&n);
	if(n==1) {
		printf("1/1");
	} else {
		for(;;) {
			y++;
			count++;
			if(count==n)
			break;
			for(k=1;k<=2*circle-1;k++)
			{
				x++;y--;
				count++;
				if(count==n)
				{
					flag=1;
					break;
				}
			}
			if(flag==1)
			break;
			x++;
			count++;
			if(count==n)
			break;
			for(k=1;k<=2*circle;k++)
			{
				x--;y++;
				count++;
				if(count==n)
				{
						flag=1;
						break;
				}
			}
			if(flag==1)
			break;
			circle++;
		}
		printf("%d/%d",x,y);
	}
	return 0;
}
时间: 2024-10-05 04:58:16

1083 Cantor表&& 1160 蛇形矩阵的相关文章

codevs 1083 1083 Cantor表【模拟+二分改进】

题目链接: http://codevs.cn/problem/1083/ 一个模拟题,列表出来就是酱紫: 这样为了找到数据在哪一组,很明显就要二分一下,自己写一个改进的二分,类似STL中的lower_bound... 1 #pragma comment(linker, "/STACK:16777216") //防爆栈 2 #include<iostream> 3 #include<algorithm> 4 #include<cstdio> 5 #in

【1083】code[vs] 1083 Cantor表 1999年NOIP全国联赛普及组

嘿嘿嘿,又是一发水题…… [传送门]:http://codevs.cn/problem/1083/ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>原题>>>>>>>>>>>>>>>>>>>>

1083 Cantor表

1083 Cantor表 1999年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 … 2/1 2/2 2/3 2/4 … 3/1 3/2 3/3 … 4/1 4/2 … 5/1 … … 我们以Z字形给上表的每一项编号.第一项是1/1,然后是1/2,2/

CODE[VS]1160 蛇形矩阵

题目描述 Description 小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该n行n列正方形矩阵以及其的对角线数字之和. 输入描述 Input Description n(即n行n列) 输出描述 Output Description n+1行,n行为组成的矩阵,最后一行为对角线数字之和 样例输入 Sample Input 3 样例输出 Sample Output 5 4 36

洛谷 P1014 Cantor表【蛇皮矩阵/找规律/模拟】

题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 … 2/1 2/2 2/3 2/4 … 3/1 3/2 3/3 … 4/1 4/2 … 5/1 … … 我们以Z字形给上表的每一项编号.第一项是1/1,然后是1/2,2/1,3/1,2/2,… 输入输出格式 输入格式: 整数N(1≤N≤10000000) 输出格式: 表中的第N项 输入输出样例 输入样例#1: 复制 7 输出样例#1: 复

1160 蛇形矩阵(codevs)

http://codevs.cn/problem/1160/ 题目描述 Description 小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该n行n列正方形矩阵以及其的对角线数字之和. 输入描述 Input Description n(即n行n列) 输出描述 Output Description n+1行,n行为组成的矩阵,最后一行为对角线数字之和 样例输入 Sample In

1160 蛇形矩阵

题目描述 Description 小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该n行n列正方形矩阵以及其的对角线数字之和. 输入描述 Input Description n(即n行n列) 输出描述 Output Description n+1行,n行为组成的矩阵,最后一行为对角线数字之和 样例输入 Sample Input 3 样例输出 Sample Output 5 4 36

codevs 1160 蛇形矩阵

时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该n行n列正方形矩阵以及其的对角线数字之和. 输入描述 Input Description n(即n行n列) 输出描述 Output Description n+1行,n行为组成的矩阵,最后一行为对角线数字之和 样例输入 Sample Input 3

codevs 1160 蛇形矩阵x

题目描述 Description 小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该n行n列正方形矩阵以及其的对角线数字之和. 输入描述 Input Description n(即n行n列) 输出描述 Output Description n+1行,n行为组成的矩阵,最后一行为对角线数字之和 样例输入 Sample Input 3 样例输出 Sample Output 5 4 36