题目:来自南阳理工学院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;
}
附上时间以及内存: