当前位置:编程学习 > C/C++ >>

高手帮忙做道c++编程题(算法要简洁清晰)

逆时针螺旋方阵

 

问题描述

下面是一个5*5螺旋方阵。你的任务是按逆时针方向旋进的n*n螺旋方阵。

1 16 15 14 13

2 17 24 23 12

3 18 25 22 11

4 19 20 21 10

5 6 7 8 9

输入

输入文件只有一行,它是由若干个整数n组成的,每两个整数之间有一个或多个空格,尾部无多余空格,(1<=n<=70)。

输出

对输入文件中的每个整数n,先在一行上输出“n=”,再输出n的值。接着在下面的n行上按n行n列的方式输出n*n螺旋方阵,行尾无空格,同一行上两个数之间空一格。两个螺旋方阵之间空一行。

输入样例

4 5

 

输出样例

n=4

1 12 11 10

2 13 16 9

3 14 15 8

4 5 6 7

 

n=5

1 16 15 14 13

2 17 24 23 12

3 18 25 22 11

4 19 20 21 10

5 6 7 8 9

追问:我运行得不对哎。。。额。。。你题目看了嘛?
答案:
// 以下代码在VC2008下测试通过
#include <iostream>
using namespace std;

int main(void)
{
int data[70][70];
int n;
while(cin >> n)
{
int x = 0, y = -1;
int c = n - 1 + 2;
int f = 4;
for(int i = 1, j = 0; i <= n*n; ++i)
{
if(f == 4)
{
f %= 4;
c -= 2;
data[x][++y] = i;
continue;
}
switch(f)
{
case 0: data[x][++y] = i; break;
case 1: data[++x][y] = i; break;
case 2: data[x][--y] = i; break;
case 3: data[--x][y] = i; break;
}
++j;
if(j == c || (j == c-1 && f == 3))
{
j = 0;
++f;
}
}

cout << "n=" << n << endl;
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < n; ++j)
cout << data[j][i] << ' ';
cout << endl;
}
cout << endl;
}
}
这个是oj的题,自己做,思路:
要最快的完成,可以自己算出每个坐标对应的值(这样每步是O(1)),自己推导下,只是稍有点繁琐

上一个:请介绍一些关于C++编程的书籍,内容要精辟独到
下一个:用C++编程一个函数实现一个字符串是否包含另一个字符串?

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,