刚开始看感觉很有意思
猛一看感觉挺简单
想想有点难
再仔细想想其实还好
我是用的边界加是否填过判定的
然后用了个 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]蛇形填数