内型回环矩阵 (内蛇形矩阵)
#include <iostream>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char** argv) {
int n = 5;
int a[100][100];
int center = 0;
int x,y = 1;
int way = 4;//1上 2下 3左 4右
if(n % 2 == 0){ //偶数的话 是在中间位置
x = n/2;
y = n/2+1;
}else{//奇数的话就是左下偏移一位
x = n/2+1;
y = n/2+1;
}
int k = 2;
int t = 0;
for(int i = 1 ;i<= n*n; i++){
if(t == 4){
t = 0;
k++;
}
if(k*k == i){
if(k%2 == 0){ //偶数的话平方在左上角 走完了
way = 3;
}else{ //奇数在右下角
way = 4; //走完了
}
t=4;
}else if( k*k - (k-1) == i){
if(k%2 == 0){ //偶数的话平方在右上角
way = 3;
}else{ //奇数在左下角
way = 4;
}
t++;
}else if(k*k - (k-1)*2 == i){
if(k%2 == 0){ //偶数的话平方在右下角
way = 1;
}else{ //奇数在左上角
way = 2;
}
t++;
}else if(k*k - (k-1)*3 == i){
if(k%2 == 0){ //偶数的话平方在左下角
way = 4;
}else{ //奇数在右上角
way = 3;
}
t++;
}
a[x-1][y-1] = i;
if(way == 1){ //上
y--;
}else if(way == 2){ //下
y++;
}else if(way == 3)//左
{
x--;
}else if(way == 4) //右
{
x++;
}
}
for(int i = 0;i<n;i++){
for(int j=0;j<n;j++){
printf("%d\t",a[j][i]);
}
printf("\n");
}
return 0;
}
官方实现方法
#include<cstdio>
#include<cstdlib>
#include<cstring>
int a[100][100];
int main()
{
freopen("snake.in","r",stdin);
freopen("snake.out","w",stdout);
int bj_a,bj_b,num=1,n,sx,i,j,sum=0;
cin>>n;
bj_a=n/2;
bj_b=n/2;
a[bj_a][bj_b]=num;
sx=1;
while(num<n*n)
{
num++;
bj_b++;
a[bj_a][bj_b]=num;
while(bj_a>n/2-sx)
{
bj_a--;
num++;
a[bj_a][bj_b]=num;
}
while(bj_b>n/2-sx)
{
bj_b--;
num++;
a[bj_a][bj_b]=num;
}
while(bj_a<n/2+sx)
{
bj_a++;
num++;
a[bj_a][bj_b]=num;
}
while(bj_b<n/2+sx)
{
bj_b++;
num++;
a[bj_a][bj_b]=num;
}
sx++;
}
bj_b++;
num++;
a[bj_a][bj_b]=num;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(i==j||i+j==n)
sum+=a[i][j];
}
for(i=0;i<n;i++)
{
for(j=0;j<n-1;j++)
printf("%d ",a[i][j]);
printf("%d",a[i][j]);
printf("\n");
}
printf("%d\n",sum);
return 0;
}