/*-------------------------------------------
昨晚搞到3点,硬是把程序写出来了,在Dev-C++中编译通过。因为注释和include问题,可能不能在C的编译器中编译,修改一下就ok了。
-------------------------------------------*/
/*--------------------------------------------
Title: 打印走圈圈矩阵
Version: 1.0
Author: cone
Date: Oct 30, 2007
Use: QQ技术支持类笔试附加题
Other: 算法比较傻
--------------------------------------------*/
#include <iostream>
#include <stdlib.h>
#define POWER 15
#define ELEMENT "%5d"
using namespace std;
main()
{
int n; //输入的n
int x[POWER][POWER]; //初始化二维数组
int i; //i来控制循环结束
int j;
int count; //计数每一步
int right, down, left, up;
//每次分别向上下左右走的步数
int pos_right, pos_down, pos_left, pos_up;
//每次分别向上下左右走的初始位置,亦作相反方向的边界
printf("please enter n: ");
scanf("%d", &n); //输入n
count = 1; //从1开始计数
pos_right = 0;
pos_down = 0;
pos_left = n - 1;
pos_up = n - 1;
for (i = n; i > 0; i = i - 2)
{
//因为每次上下或左右两边界都要向中间缩一步,所以i每次减2
for (right = pos_right; right < pos_left; right++) //用pos_left来定右界
{
//从pos_right开始向右走,走到pos_left的前一步
x[pos_down][right] = count; //借用pos_down来指定行号
count++;
}
for (down = pos_down; down < pos_up; down++) //借用pos_up来定下界
{
//从pos_down开始向下走,走到pos_up的前一步
x[down][pos_left] = count; //借用pos_left来指定列号
count++;
}
for (left = pos_left; left > pos_right; left--) //用pos_right来定左界
{
//从pos_left开始向左走,走到pos_right的前一步
x[pos_up][left] = count; //借用pos_up来指定行号
count++;
}
for (up = pos_up; up > pos_down; up--) //用pos_down来定上界
{
//从pos_up开始向上走,走到pos_down的前一步
x[up][pos_right] = count; //借用pos_right来指定列号
count++;
}
pos_right++;
pos_down++;
pos_left--;
pos_up--;
//pos_分别向右下左上各移一步,也是各边界向中间各缩一步
if (pos_right == pos_left)
{
x[pos_right][pos_left] = n * n;
break;
}
/*因为当n为奇数时上面的4个循环均未能考虑到正中的那个位置,
即最后一步,所以这里在每次走完一圈后加上一个判断。n为奇数
的最后一步,四个pos_相同,这里随便取了两个pos_来判断,直接
给最后一步赋值为(n*n),可能是比较傻的方法了*/
}
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
printf(ELEMENT, x[i][j]); //打印矩阵
}
printf("\n");
}
system("PAUSE");
return 0;
}
2007年10月31日 星期三 12:41 P.M.
-EOF-