回形取数--------新思路(蛇形排列的拓展)
原题:
问题描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入格式
输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出格式
输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
样例输入
3 3
1 2 3
4 5 6
7 8 9
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 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;
}
#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;
}
#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;
}
别趴下,熬过黑夜就是黎明
浙公网安备 33010602011771号