0
已解决
邵逸儒
中级天翼
中级天翼
1742 生日游戏
题目描述 Description
明天是小伟的生日,他想设计一个游戏可以和小伙伴们一起玩。
小伟家的房间是个n * m的矩阵,房间地上铺满了1 * 1的地砖,每块砖上都有一个数字。
墙墙是小伟的好朋友,墙墙喜欢螺旋形,他觉得按照顺时针螺旋形的依次走过每块地砖会很有趣,小伟不喜欢重复,他不愿意经过同一块地砖第二次。所以他们定下了按照以下规则来走过地砖:
① 从第一行第一列的地砖开始,初始方向是向右。
② 当他走到一块砖上,如果他下一步不能往前(继续往前会走到一块已经走过的地砖 或者 继续往前会撞到墙上)的时候,向右转。
输入描述 Input Description
第一行:整数n,m,分别表示房间的长和宽。
接下来是一个 n * m 的矩阵,表示房间的地砖上的数字
输出描述 Output Description
输出共 n 行,每行 m 个整数。
你需要依次输出从第一行第一块砖开始走,他所遍历的地砖上的数字。
样例输入 Sample Input
3 4
1 2 3 4
5 6 7 8
9 10 11 12
样例输出 Sample Output
1 2 3 4
8 12 11 10
9 5 6 7
数据范围及提示 Data Size & Hint
注意:砖上的数字可能会重复
1 <= n*m <= 1000000
请大神教一下,谢谢!
http://judge.codingtang.com/problem/1742/
邵逸儒在2018-01-22 22:31:48追加了内容
急!!!
2
已采纳
梁锦程
高级光能
高级光能
楼主同学,这道题要每一层的起点是 (i,i),分为两类,但要判断奇数偶数的情况,n是偶数,i的范围是 1--n/2,否则i的范围是1--n/2+1
我帮你实现了一个函数,剩下的你自己实现,好不好?
#include<iostream>
using namespace std;
int a[1000][1000];
void foo1(int n,int m) //n<=m 行小于等于列
{
for(int i=1;i<=n/2;i++)
{
int j=i;
for(int j=i;j<=m-i;j++)
cout<<a[i][j]<<' ';
for(int j=i;j<=n-i;j++)
cout<<a[j][m-i+1]<<' ';
for(int j=m-i+1;j>=i+1;j--)
cout<<a[n-i+1][j]<<' ';
for(int j=n-i+1;j>=i+1;j--)
cout<<a[j][i]<<' ';
}
if(n%2)
{
for(int j=n/2+1;j<=m-(n/2+1)+1;j++)
{
cout<<a[n/2+1][j]<<' ';
}
}
}
void foo2(int n,int m)
{
}
int main()
{
int n,m,i,j;
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
foo1(n,m);
return 0;
}
0
0
0