用递归解决蛇形填数的问题

题目:来自南阳理工学院oj

     本文提出一种递归的方法,可供参考。

     我们分析一下这个蛇形矩阵的形成过程:先由右侧起第一列由上到下填写(矩阵元素数字递增),到达规定的个数后,自右向左填写(矩阵元素数字递增),到达规定个数后,由下到上填写(矩阵元素数字递增),此时,矩阵的侧面与底已经填写完毕。然后填写剩余部分,此时填数呈现规律:先由左到右填,到尽头后由上到下,再由右向左,再由下到上,到矩阵中所有元素都被填满为止。在侧面与底填写完毕的情况下,填写剩余部分可以看成一个递归的过程。都是左-右,上-下,右-左,下-上的过程。

    我们分析一下递归的退出条件:矩阵中所有元素都填写完毕,此时开始写代码。

    分两步:1 :填写侧面与底部

                    2:填写剩余部分(递归)

   下面附上代码:匆忙AC,代码不是很精炼,仅供参考。

#include<iostream>
using namespace std;
int a[1000][1000]={0};
int init(int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		a[i][n-1]=i+1;
	}
	i=i+1;
	for(int j=n-2;j>=0;j--)
	{
		a[n-1][j]=i++;
	}
	for(int k=n-2;k>=0;k--)
	{
		a[k][0]=i++;
	}
	return i;
}
int drawSnake(int N,int i)
{
	bool flag=false;
	int a1,b;
	for(a1=0;a1<N;a1++)
	{
		for( b=0;b<N;b++)
		{
			if(a[a1][b]==0)
			{
				flag=true;
				break;
			}
		}
		if(flag)
		{
			break;
		}
	}
	if(!flag)
	{
		return 0;
	}
	{
		int c=a1;
		i=i+1;
		for(int l=b;;l++)
		{
			if(a[c][l]==0)
			{
				a[c][l]=i++;
			}else
			{
				for(int m=c+1;;m++)
				{
					if(a[m][l-1]==0)
					{
						a[m][l-1]=i++;
					}else
					{

						for(int n=m-2;n>=0;n--)
						{
							if(a[m-1][n]==0)
							{
								a[m-1][n]=i++;
							}else
							{
								for(int p=m-2;p>=0;p--)
								{
									if(a[p][n+1]==0)
									{
										a[p][n+1]=i++;
									}else
									{
										i=i-1;
										return drawSnake(N,i);
									}
								}
							}
						}
					}
				}
			}

		}
	}
	
}
void show(int n)
{
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n-1;j++)
		{
			cout<<a[i][j]<<" ";
		}
		cout<<a[i][n-1]<<endl;
	}
}
void fun(int c)
{
	return;
}
int main()
{
	int x;
	cin>>x;
	fun(drawSnake(x,init(x)-1));
	show(x);
	//system("pause");
	return 0;

}
附上时间以及内存:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值