假期无聊,写了一下基础题目,斜杠矩阵。

 

这个具体的思路,我也不知道如何解释,双向与单向只是多了一个变量控制,思路简单来说就是找到他不变的量与相等量。

 

具体看以下代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <windows.h>
using namespace std;
const int maxn=1e3+5;
int num[maxn][maxn];
int main()
{
    int m,n;
    printf("请输入矩阵边长:");
    while(~scanf("%d",&n))
    {
        while(2)
        {
            int tot=0;
            int x,y,ans=1;
            system("cls");
            memset(num,0,sizeof(num));
            system("color F0");
            tot=0;
            printf("\n*************************\n");
            printf("\n*    1-左上角双向循环   *\n");
            printf("\n*    2-右上角双向循环   *\n");
            printf("\n*    3-左下角单向循环   *\n");
            printf("\n*    4-右下角单向循环   *\n");
            printf("\n*    5-重新定义边长     *\n");
            printf("\n*********************\n");
            printf("请输入您的选择:");
            int cho;
            scanf("%d",&cho);
            if(cho==1)
            {
                y=1;
                while(y<=n)
                {
                    if(ans%2)//ans控制方向
                        for(int i=1,k=y;i<=y;i++,k--)//往左下方走 每次开始都是从x=1开始。
                            num[i][k]=++tot;//一个终止条件即可,因为此为n阶。
                    else
                        for(int i=y,k=1;i>=1;i--,k++)//往右上方走 每次开始都是从y=1开始。
                            num[i][k]=++tot;//之后的四个图案都一样,不在解释。
                    y++;
                    ans++;
                }
                y=2;
                while(y<=n)
                {
                    if(ans%2)
                        for(int i=y,k=n;i<=n;i++,k--)
                            num[i][k]=++tot;
                    else
                        for(int i=n,k=y;k<=n;k++,i--)
                            num[i][k]=++tot;
                    y++;
                    ans++;
                }
            }
            else if(cho==2)
            {
               x=1;
               ans=1;
               while(x<=n)
               {
                    if(ans%2)
                        for(int i=x,k=n;i>=1;i--,k--)
                            num[i][k]=++tot;
                    else
                        for(int i=1,k=n-x+1;i<=x;i++,k++)
                            num[i][k]=++tot;
                    x++;ans++;
                }
               x=2;
               while(x<=n)
               {
                   if(ans%2)
                        for(int i=n,k=n+1-x;k>=1;k--,i--)
                            num[i][k]=++tot;
                    else
                        for(int k=1,i=x;i<=n;i++,k++)
                            num[i][k]=++tot;
                    x++;ans++;
               }
            }
            else if(cho==3)
            {
                y=1;
                while(y<=n)
                {
                    for(int i=n,k=y;k>=1;i--,k--)
                        num[i][k]=++tot;
                    y++;
                }
                y=n-1;
                while(y>=1)
                {
                    for(int i=y,k=n;i>=1;i--,k--)
                        num[i][k]=++tot;
                    y--;
                }
            }
            else if(cho==4)
            {
                y=n;
                while(y>=1)
                {
                    for(int i=n,k=y;k<=n;k++,i--)
                        num[i][k]=++tot;
                    y--;
                }
                y=n-1;
                while(y>=1)
                {
                    for(int i=y,k=1;i>=1;i--,k++)
                        num[i][k]=++tot;
                    y--;
                }
            }
            else
            {
                printf("重新输入边长: ");
                break;
            }
            system("cls");
            system("color Fa");
            for(int i=1;i<=n;i++)
            {
                for(int k=1;k<=n;k++)
                    printf("%5d",num[i][k]);
                printf("\n");
            }
            system("pause");
        }
    }
    return 0;
}

 

如果有更好的方法,还望评论中指教。