/*
蛇形填数:
在n*n方阵里填入1,2,...,n*n。要求填成蛇形。例如n=4时方阵为:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
上面的方阵中,多余的空格只是为了便于观察规律,不必严格输出。n<=8
00 01 02 0,n-1
10 11 12 1,n-1
................
n-2,0 n-2,1 n-2,2 n-2,n-1
n-1,0 n-1,1 n-1,2 n-1,n-1
*/
/*
关键:
1 本质是 iMatrix[++x][y],iMatrix[x][++y],iMatrix[x][--y],iMatrix[--x][y]的变化,用标记数组和迷宫界限来过滤搜索条件
2 while( x+1 < n && !iMatrix[x+1][y])//从上向下,横坐标不能越界,并且不能被访问过,索性把一排全部处理结束再做下一排
3 memset(iMatrix,0,sizeof(iMatrix));//需要对二维数组重新赋值
4 printf("%3d ",iMatrix[i][k]);//防止不美观,用printf("%3d ",iMatrix[i][k])
*/
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#define MAXSIZE 50
/*
void snakeNum(int n)
{
int iMatrix[MAXSIZE][MAXSIZE];
int iDown,iLeft,iRight,iUp;
for(int i = 1 ; i <= n*n ; i++)
{
//先向下
for(iDown = 0; iDown <= n-2 ;iDown++)//初始值和迭代区间是动态变化的
{
iMatrix[iDown][n-1] = i;//列在动态变化
}
//再向左
if(iDown >= n-1)
{
for(iLeft = n-1; iLeft >= 1; iLeft--)//最后一排
{
iMatrix[n-1][iLeft] = i;
}
}
//再向上
if(iLeft >=0 )
{
for(iUp = n-1;iUp >= 1 ; iUp--)
{
iMatrix[iUp][0] = i;
}
}
//再向右
if(iUp >= 0)
{
for(iRight = 0 ; iRight <= n - 2 ; iRight++)
{
iMatrix[0][iRight] = i;
}
}
}
}
*/
void snakeNum(int n)
{
int iMatrix[MAXSIZE][MAXSIZE];
memset(iMatrix,0,sizeof(iMatrix));//需要对二维数组重新赋值
int iVal = 1;
int y = n-1,x = 0;
iMatrix[x][y] = iVal;
while(iVal < n*n)//=号不能取,否则陷入死循环中
{
//从上向下,横坐标不能越界,并且不能被访问过,索性把一排全部处理结束再做下一排
//while( x+1 < n - 1 && iMatrix[x+1][y] != 0)
while( x+1 < n && !iMatrix[x+1][y])
{
iMatrix[++x][y] = ++iVal;
}
//从右向左,纵坐标不能越界,并且不能被访问过
//while( y-1 > 0 && iMatrix[x][y-1] != 0)
while( y-1 >= 0 && !iMatrix[x][y-1])
{
iMatrix[x][--y] = ++iVal;
}
//从下向上,横坐标不能越界
//while( x-1 > 0 && iMatrix[x-1][y] != 0)
while( x-1 >= 0 && !iMatrix[x-1][y])
{
iMatrix[--x][y] = ++iVal;
}
//从左向右,纵坐标不能超过n
//while( y+1 < n-1 && iMatrix[x][y+1] !=0 )
while( y+1 < n && !iMatrix[x][y+1])
{
iMatrix[x][++y] = ++iVal;
}
}
for(int i = 0 ; i < n ; i++ )
{
for(int k = 0 ; k < n ; k++)
{
printf("%3d ",iMatrix[i][k]);//防止不美观,用printf("%3d ",iMatrix[i][k])
}
printf("\n");
}
}
int main(int argc,char* argv[])
{
int n;
scanf("%d",&n);
snakeNum(n);
system("pause");
return 0;
}