您的位置:首页 > 其它

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

2017-08-02 08:23 134 查看
题目:来自南阳理工学院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]
==0)
{
a[m-1]
=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;

}

附上时间以及内存:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: