高手帮忙做道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++编程一个函数实现一个字符串是否包含另一个字符串?