您的位置:首页 > 其它

算法竞赛入门经典: 第三章 数组和字符串 3.3蛇形填数

2015-08-11 10:49 417 查看
/*
蛇形填数:
在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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: