http://acm.ecnu.edu.cn/problem/2983/
思路:每次循环一圈,递归。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define INF 11
int snake[INF][INF];
int num=1;
void draw(int start,int l) {
int i,j,len;
if(l==1) {
snake[start][start]=num;
return ;
}
if(l==0)
return;
len=start+l;
for(i=start; i<len; i++) {//上
snake[start][i]=num;
num++;
}
for(i=start+1; i<len; i++) {//右
snake[i][len-1]=num;
num++;
}
for(i=len-2; i>=start; i--) {//下
snake[len-1][i]=num;
num++;
}
for(i=len-2; i>start; i--) {//左
snake[i][start]=num;
num++;
}
draw(start+1,l-2);
}
int main() {
int i,t,j,n,h;
scanf("%d",&t);
for(h=0; h<t; h++) {
scanf("%d",&n);num=1;
printf("case #%d:\n",h);
draw(0,n);
for(i=0; i<n; i++) {
for(j=0; j<n-1; j++)
printf("%d ",snake[i][j]);
printf("%d\n",snake[i][j]);
}
}
return 0;
}