GitBook

这里写图片描述

刚开始看感觉很有意思 猛一看感觉挺简单 想想有点难 再仔细想想其实还好

我是用的边界加是否填过判定的 然后用了个 flag 标记当前的填充方式

#include<stdio.h>
#include<string.h>
int main() {
	int n;
	int map[120][120];
	while(scanf("%d",&n)!=EOF) {
		memset(map,0,sizeof(map));
		int y=1,x=n,cnt=0;
		int flag=1;
		while(cnt<n*n) {
			map[y][x]=++cnt;
			if(flag==1)
				y++;
			else if(flag==2)
				x--;
			else if(flag==3)
				y--;
			else if(flag==4)
				x++;
			if(map[y][x]||x<1||x>n||y<1||y>n) {
				if(flag==1) {
					y--;
					x--;
					flag=2;
				} else if(flag==2) {
					x++;
					y--;
					flag=3;
				} else if(flag==3) {
					y++;
					x++;
					flag=4;
				} else if(flag==4) {
					x--;
					y++;
					flag=1;
				}
			}
		}
		for(int i=1; i<=n; i++) {
			for(int j=1; j<=n; j++) {
				printf("%d",map[i][j]);
				if(j!=n)
					printf(" ");
			}
			printf("\n");
		}
	}
	return 0;
}

标程思路是循环几圈 然后通过数学关系直接按照 下左上右的循环输出 也是非常巧妙

#include<stdio.h>
int main() {
	int a,b,c,d,n,sum=1;
	int yi[101][101];
	scanf("%d",&n);
	for(a=0; a<=(n-1)/2; a++) {
		for(b=a; b<=n-a-1; b++)
			yi[b][n-a-1]=sum++;
		for(b=n-2-a; b>=a; b--)
			yi[n-a-1][b]=sum++;
		for(b=n-a-2; b>=a; b--)
			yi[b][a]=sum++;
		for(b=a+1; b<n-a-1; b++)
			yi[a][b]=sum++;
	}
	for(c=0; c<n; c++) {
		for(d=0; d<n; d++)
			printf("%d ",yi[c][d]);
		printf("\n");
	}
}

题目地址:【NYOJ】[33]蛇形填数