您的位置:首页 > 编程语言 > C语言/C++

C语言旋转数字矩阵

2014-02-21 17:41 141 查看
题目要求:打印如下数字矩阵

    01 02 03 04 05 

   16 17 18 19 06 

   15 24 25 20 07 

   14 23 22 21 08 

   13 12 11 10 09 

工作之余,前辈总会给笔者介绍点“对象”。

前日,前辈放下咖啡,看那一圈圈的波纹,四有所悟,于是闭目修心。

前辈三省龙体之后,不忘恩泽小辈,豪墨一挥,一个”对象“脱纸而出。

笔者赶紧拜谢,牵了这新”对象“,躺椅而卧,入木三分。

“对象“、”对象“你在哪里。周杰棍唱过”对象就是龙卷风“,转得某晕头转向,不辨西东。

前辈的帖子http://www.cnblogs.com/wangchenggen/p/3558543.html

笔者四眼田鸡一头。路遇美女,只看到一个修长的影子从远到近再到远。这是个凄美的过程,根本就没有我要的对象。

于是乎,先来谈谈笔者对过程的理解。

0.直接的做法

size*size的矩阵初始化为0,开始向→走,当x,y越界或者a[x][y]已经有非0数字时,换个方向继续。简单的迷宫走法。

此方法不作详解,各位大侠都晓。悟道悟道,与众不同,以下为不寻常之路,或增麻烦。

1.找规律。

  好吧,笔者没找到,空余水杯画圈圈。

2.死磕。

死磕是最简单,最直接的方法,也是不见对象,只有过程。

来吧,跟着笔者画圈圈,诅咒灰太狼。

size矩阵大小。

首先,美女向前走了size步,

然后,向下转弯,走了(size-1)步,

再然后……

size为5的情况下

方向     长度

→  5

↓ 4

← 4

↑ 3

→ 3

↓ 2

← 2

↑ 1

→ 1

总步    25

3.整理,找规律。

好像有那么点感觉,

难道 n*n = (1+…+(n-1))  +  (1+…n)

笔者在纸上画了几下,好吧,果然是这样。小学课本有这么教吗?

但这样,好像也没规律。

4.继续找规律。

恩,除了第一个长度外,其他的长度都走了2次,直到1走了2次。,结束。

这又让笔者想起来了学习时用堆栈写的那个迷宫游戏,哇咔咔。

5.写代码。

好吧,既然规律找到了,就开始写代码。

首先,把变量找出来。

1.美女站在数字为1的这个位置

参数提取:当前数字int  num,  位置坐标 int x,y

2.美女向右边走,

参数提取:运动方向  dir(只有四个方向,所以用枚举),路的长度  int  len

位置变化:与方向有关

3.美女走了8个长度开始右转

参数提取:美女要转弯,那应该有个参数记录美女什么时候转弯,

也就是当前方向的步数int  step

函数:美女要转弯,转弯函数。 及 step = len时转弯, 方向也发生变化

4.美女继续走,美女突然发现, 为什么同样长度的路,除了开始的时候走了1遍,其他走了2遍。

参数提取:同样长度的路,美女走了几次后转弯。记录美女在同样长度的路上,走了第几次 int times

5.美女走完2次1长度的路以后,结束了,当前是n*n

结束条件:美女走的总长度 = n*n 或 美女走完1,开始走0长度的路。

于是,整个过程结束。

代码如下

#define SIZE 8  //矩阵大小

int ary[SIZE][SIZE]; //矩阵

enum Dir  //方向

{
dir_right = 0,
dir_down,
dir_left,
dir_up

};

   

下面是美女对象,好吧,笔者眼睛不好,就看到一个点。

class Pointer

{

public:
Pointer():x(0),y(0),dir(dir_right),times(1),len(SIZE),step(0),num(1)
{
}

private:

void changeDir()  //美女走下一步之前,先考虑下要不要改变方向
{
if (step == len)//当前方向走完了
{
if ( !(times = (times + 1)%2))//该长度发生变化 为0
{
len--;
}
step = 0;
dir = (Dir)((dir + 1)%4);   //能用小学数学解决的问题,坚决不用if  esle,往前数4行,times也是。

    // 什么? 类型转换? 难道这不是C语言吗?

}
}

void nextpos()  //美女下一步的位置
{
switch (dir)
{
case dir_right:
x++;
break;
case dir_down:
y++;
break;
case dir_left:
x--;
break;
case dir_up:
y--;
break;
default:
break;
}
}

public:
void walk()
{
while (len)
{
int tmpx = x;
ary[x][y] = num++;//当前位置,下一个位置的数字
step++;
 //表示走了当前方向走了一步
changeDir();
nextpos();
}
}

private:
int x;
int y;
Dir dir;
int times;//当前长度下的次数 0第一次,1第二次
int len;//当前长度
int step;//当前长度下的步数
int num;//当前数值

};

//主函数

int main()

{
Pointer p; 
p.walk();

for (int i = 0 ; i < SIZE; i++)
{
for ( int j =0 ; j < SIZE; j++)
{
printf("%02d ",ary[j][i]);
}
printf("\n");
}

return 0;

}

好吧,美女越来越远,依然找不到”对象“。

好吧,笔者承认这是过程,不是”对象“。

方停歇,前辈在转笔,难道是六道轮回之路?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: