回形取数--------新思路(蛇形排列的拓展)

原题:

问题描述
  回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入格式
  输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出格式
  输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
样例输入
3 3
1 2 3
4 5 6
7 8 9
样例输出
1 4 7 8 9 6 3 2 5
样例输入
3 2
1 2
3 4
5 6
样例输出
1 3 5 6 4 2
题解:这个题自然而然想到了蛇形排列的题,结果敲出来提交后70分,看了下两组数据不对,发现200*200,就果断放弃对代码,思考可能是思路不对,时间太长,内存太大。
    #include<iostream>
#include<cstdio>
#include<cstring>
int s[400][400];
using namespace std;
int main()
{
    int x,y;
    cin>>x>>y;
    memset(s,0,sizeof(s));
    for(int i=1; i<=x; i++)
    {
        for(int j=1; j<=y; j++)
            cin>>s[i][j];
    }
    int i=1,j=1,en=x*y;
    for(int k=1; k<=en; k++)
    {
        if(k!=1)
            cout<<' ';
        cout<<s[i][j];
        if(s[i][j-1]==0&&s[i+1][j]!=0)
        {
            s[i][j]=0;
            i++;
            continue;
        }
        else if(s[i][j+1]!=0)
        {
            s[i][j]=0;
            j++;
            continue;
        }
        else if(s[i-1][j]!=0)
        {
            s[i][j]=0;
            i--;
            continue;
        }
        else if(s[i][j-1]!=0)
        {
            s[i][j]=0;
            j--;
            continue;
        }
    }
    return 0;
}
后来去百度搜索,结果发先可以改进思路,是按照可以一共循环多少次数循环(一次按一圈算)
ac代码:
#include<iostream>
#include<cstdio>
#include<cstring>
int s[210][210];
using namespace std;
int main()
{
    int x,y;
    cin>>x>>y;
    for(int i=1;i<=x;i++)
        for(int j=1;j<=y;j++)
        cin>>s[i][j];
    for(int k=1;k<=(x+1)/2&&k<=(y+1)/2;k++)
    {
        for(int i=k;i<=x-k+1;i++)
            cout<<s[i][k]<<' ';
        for(int j=k+1;j<=y-k+1;j++)
            cout<<s[x-k+1][j]<<' ';
        if(y-k>=k)
            for(int j=x-k;j>=k;j--)
               cout<<s[j][y-k+1]<<' ';
        if(x-k>=k)
            for(int j=y-k;j>=k+1;j--)
              cout<<s[k][j]<<' ';
    }
    return 0;
}

posted @ 2020-04-12 14:01  Joelin12  阅读(340)  评论(0)    收藏  举报