问题标题: 酷町堂 1742 生日游戏

0
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
谢祎恒
谢祎恒
中级守护
中级守护

用while循环,然后判断当前数的位置,用一个数来累加

0
我要回答