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

来源:互联网 发布:都市网络h小说合集chm 编辑:程序博客网 时间:2024/05/21 23:00

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