B*M 发帖数: 1340 | 1 一个大小为n的方形矩阵, 按顺时针的方向打印, 白板coding
比如:
1 2 3
4 5 6
7 8 9
打印顺序: 1 2 3 6 9 8 7 4 5
大家说说思路,多谢! | f*******e 发帖数: 1161 | 2 控制两个x,y增量,每转一圈重新计算边界条件,
比如n,第一圈n-1,第二圈n-3
应该是这样的吧?
【在 B*M 的大作中提到】 : 一个大小为n的方形矩阵, 按顺时针的方向打印, 白板coding : 比如: : 1 2 3 : 4 5 6 : 7 8 9 : 打印顺序: 1 2 3 6 9 8 7 4 5 : 大家说说思路,多谢!
| B*M 发帖数: 1340 | 3 没懂,转角的地方怎么转?
【在 f*******e 的大作中提到】 : 控制两个x,y增量,每转一圈重新计算边界条件, : 比如n,第一圈n-1,第二圈n-3 : 应该是这样的吧?
| f*******e 发帖数: 1161 | 4 x=1, y=0; -->
x=0, y=1; -->
x=-1,y=0; -->
x=0, y=-1; --> n-=2, repeat
【在 B*M 的大作中提到】 : 没懂,转角的地方怎么转?
| f*******e 发帖数: 1161 | 5 有帮助的话,赏个包子?
【在 f*******e 的大作中提到】 : x=1, y=0; --> : x=0, y=1; --> : x=-1,y=0; --> : x=0, y=-1; --> n-=2, repeat
| B*M 发帖数: 1340 | 6 包子当然可以给,
不过仍然没懂你的思路,
【在 f*******e 的大作中提到】 : 有帮助的话,赏个包子?
| D***h 发帖数: 183 | 7 类似于递归.
i=0开始,
以(i,i)为起点,打印最外面一圈(n)
然后从(i+1,i+1),打印长度为n-2的一圈
直到打印完。
【在 B*M 的大作中提到】 : 一个大小为n的方形矩阵, 按顺时针的方向打印, 白板coding : 比如: : 1 2 3 : 4 5 6 : 7 8 9 : 打印顺序: 1 2 3 6 9 8 7 4 5 : 大家说说思路,多谢!
| B*M 发帖数: 1340 | 8 您老的思路基本和我是一样的,
最外一圈转弯儿时候怎么code好些?
【在 D***h 的大作中提到】 : 类似于递归. : i=0开始, : 以(i,i)为起点,打印最外面一圈(n) : 然后从(i+1,i+1),打印长度为n-2的一圈 : 直到打印完。
| f*******e 发帖数: 1161 | 9 多谢包子,又可以赌了,呵呵。。
我再看看,试着写个伪代码?
【在 B*M 的大作中提到】 : 包子当然可以给, : 不过仍然没懂你的思路,
| W***i 发帖数: 9134 | 10 private int[][] A = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
public void printA()
{
int endX = A.length-1;
int endY = endX;
int startX = 0;
int startY = 0;
while(endX > 0 )
{
for(int i = startX; i <= endX; i++)
{
System.out.print(A[startX][i] + ",");
}
startY++;
for(int i = startY; i <= endY; i++)
{
System.out.print(A[i][endX] + ",");
}
endX--;
| | | f*******e 发帖数: 1161 | 11 这个好,不过既然刚才说了,就贴上代码献献丑,也不枉费你的俩包子
void twist_print(int* vec, int n){
static const int dxs[] = {1,0,-1,0};
static const int dys[] = {0,1,0,-1};
int x(0),y(0);
for(int c=n-1;c>0;c-=2){
for(int i(0); i < 4; ++i ){
int dx(dxs[i]), dy(dys[i]);
for(int bd=c;bd>0;--bd){
cout << vec[n*y+x];
x+=dx, y+=dy;
}
}
【在 W***i 的大作中提到】 : private int[][] A = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}; : public void printA() : { : int endX = A.length-1; : int endY = endX; : int startX = 0; : int startY = 0; : while(endX > 0 ) : { : for(int i = startX; i <= endX; i++)
| B*M 发帖数: 1340 | 12 您老这思路和我差不多,
都是写4个for
【在 W***i 的大作中提到】 : private int[][] A = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}; : public void printA() : { : int endX = A.length-1; : int endY = endX; : int startX = 0; : int startY = 0; : while(endX > 0 ) : { : for(int i = startX; i <= endX; i++)
| B*M 发帖数: 1340 | 13 您老这个比较高妙一些,
不必写4个for,
最后那个print中点的是啥意思?
【在 f*******e 的大作中提到】 : 这个好,不过既然刚才说了,就贴上代码献献丑,也不枉费你的俩包子 : void twist_print(int* vec, int n){ : static const int dxs[] = {1,0,-1,0}; : static const int dys[] = {0,1,0,-1}; : int x(0),y(0); : for(int c=n-1;c>0;c-=2){ : for(int i(0); i < 4; ++i ){ : int dx(dxs[i]), dy(dys[i]); : for(int bd=c;bd>0;--bd){ : cout << vec[n*y+x];
| W***i 发帖数: 9134 | 14 他写的我也没看到, 不过也有3个for
【在 B*M 的大作中提到】 : 您老这个比较高妙一些, : 不必写4个for, : 最后那个print中点的是啥意思?
| B*M 发帖数: 1340 | 15 while(endX>0)??
是这样么?
【在 W***i 的大作中提到】 : private int[][] A = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}; : public void printA() : { : int endX = A.length-1; : int endY = endX; : int startX = 0; : int startY = 0; : while(endX > 0 ) : { : for(int i = startX; i <= endX; i++)
| f*******e 发帖数: 1161 | 16 n是奇数的时候,中间那个点正好是c=0,所以就另外打印一下
思路都查不多,实现细节略有不同而已
【在 B*M 的大作中提到】 : 您老这个比较高妙一些, : 不必写4个for, : 最后那个print中点的是啥意思?
| B*M 发帖数: 1340 | 17 嗯,他的代码难懂,
估计也是对的,看他的代码很转的样子,
【在 W***i 的大作中提到】 : 他写的我也没看到, 不过也有3个for
| f*******e 发帖数: 1161 | 18 我就喜欢写别人懂不了的代码,哈哈。。
思路应该跟wensi是一样的
【在 B*M 的大作中提到】 : 嗯,他的代码难懂, : 估计也是对的,看他的代码很转的样子,
| B*M 发帖数: 1340 | 19 好的,多谢几位,
【在 f*******e 的大作中提到】 : 我就喜欢写别人懂不了的代码,哈哈。。 : 思路应该跟wensi是一样的
| W***i 发帖数: 9134 | 20 是啊, 代码运行过, 我觉得4个for大概可以合并成一个,至少可以合并成2个,或者
写个子函数。。。
【在 B*M 的大作中提到】 : while(endX>0)?? : 是这样么?
| j**l 发帖数: 2911 | 21 三种方法。
方法一,直感式思考,从左上角水平向右吭哧吭哧走,碰壁,哐铛停下来。改竖直方向
,因为向上越界,只能向下,继续吭哧吭哧向下走走,再次碰壁,停下来后水平从右向
左走...
原则,不能越界,访问过的元素作标记后也不能越过。碰壁后水平改竖直,竖直改水平
,只要能走,必只有一个方向可走,直到最后无路可走的时候终止。
方法二,穷举四个分段路径走完外一圈,改变参数(比如下次每段的长度比上次减少2)
,继续迭代走内一圈。
方法三,同方法二,走完最外一圈后用递归取代迭代。 | s*******s 发帖数: 27 | 22 一层循环实现方法,缺点是MoveNext比较复杂一点---条件比较多。
void PrintSquareArray(int n, int* A)
{
int origin_x = 0;
int origin_y = 0;
int current_size = n;
int current_x = 0;
int current_y = 0;
do
{
printf("%d (%d)\n", A[current_x*n + current_y], current_size);
}while(MoveNext(origin_x, origin_y, current_size, current_x,
current_y));
}
bool MoveNext(int &origin_x, int &origin_y, int &square_size, int
¤t_x
, int ¤t_y)
{
int x = current_x - or |
|