如何打印出如下的图形

yaofli 2007-11-13 07:33:16
当N=1
1
4 5 2
3
N=2
1 2
8 9 10 3
7 12 11 4
6 5
依次类推螺旋试的打印出来.请会的解释下玄机,谢谢

...全文
245 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ttlyfast 2007-11-13
  • 打赏
  • 举报
回复
以前俺也对算法感兴趣来的 现在却一点兴趣都没
Wolf_FienD 2007-11-13
  • 打赏
  • 举报
回复
呵呵 谢谢LS夸奖 对逻辑和算法题 比较感兴趣而已
独孤过儿 2007-11-13
  • 打赏
  • 举报
回复
呵呵,狼真的是下了血本了

楼主画一个二维矩阵,然后把数字填进去,再看矩阵的下标有什么规律,就容易写出来了
Wolf_FienD 2007-11-13
  • 打赏
  • 举报
回复
int _num =2;

int _max = _num*_num + 4*_num;

//int _array[_num+2][_num+2];

int _array[4][4];


如果你改_num的话 就是你的 N 要记得把 数组的大小也改哦
Wolf_FienD 2007-11-13
  • 打赏
  • 举报
回复

#include <iostream>

bool Iw(int i,int j,int _num) //判断是不是角上 角上写0
{
if((i==0 && j==0) || (i==_num+1 && j==0) || (i==0 && j==_num+1) || (i==_num+1 && j==_num+1))
{
return false;
}
return true;
}

int main()
{
int _num =2;
/*std::cout << "input number" << std::endl;
std::cin >> _num;*/

int _max = _num*_num + 4*_num;

//int _array[_num+2][_num+2];
int _array[4][4];

int a,b,c,d,e,f=1;
for(e=0;e<(_num+3)/2; e++) //写数据
{
for(a=e; a<_num+2-e; a++) //-->写这个方向
{
if(Iw(e,a,_num))
{
_array[e][a]=f++;
if(f>_max)
goto end;
}else
_array[e][a]=0;
}

for(b=e+1; b<_num+2-e; b++)//向下写
{
if(Iw(b,a-1,_num))
{
_array[b][a-1]=f++;
if(f>_max)
goto end;
}else
_array[b][a-1]=0;
}

for(c=_num-e; c>=e; c--)//向左写
{
if(Iw(b-1,c,_num))
{
_array[b-1][c]=f++;
if(f>_max)
goto end;
}else
_array[b-1][c]=0;
}

for(d=_num-e; d>=e+1; d--)//向上写
{
if(Iw(d,c+1,_num))
{
_array[d][c+1]=f++;
if(f>_max)
goto end;
}else
_array[d][c+1]=0;
}
}
end:
for(int i=0; i<_num+2 ; i++) //打印
{
for(int j=0; j<_num+2; j++)
{
if(_array[i][j]==0)
std::cout << " ";
else
std::cout << _array[i][j] <<" ";
}

std::cout << std::endl;

}
return 0;
}




现在真的行了 不行你拿 板凳拍我
Wolf_FienD 2007-11-13
  • 打赏
  • 举报
回复
郁闷啊 有点小BUG
Wolf_FienD 2007-11-13
  • 打赏
  • 举报
回复

#include <iostream>

bool Iw(int i,int j,int _num) //判断是不是角上 角上写0
{
if((i==0 && j==0) || (i==_num+1 && j==0) || (i==0 && j==_num+1) || (i==_num+1 && j==_num+1))
{
return false;
}
return true;
}

int main()
{
int _num =2;
/*std::cout << "input number" << std::endl;
std::cin >> _num;*/

int _max = _num*_num + 4*_num;

//int _array[_num+2][_num+2];
int _array[4][4];

int a,b,c,d,e,f=1;
for(e=0;e<(_num+3)/2; e++) //写数据
{
for(a=e; a<_num+2-e; a++) //-->写这个方向
{
if(Iw(e,a,_num))
{
_array[e][a]=f++;
if(f>_max)
goto end;
}else
_array[e][a]=0;
}

for(b=e+1; b<_num+2-e; b++)//向下写
{
if(Iw(b,a-1,_num))
{
_array[b][a-1]=f++;
if(f>_max)
goto end;
}else
_array[b][a-1]=0;
}

for(c=_num-e; c>=e; c--)//向左写
{
if(Iw(b-1,c,_num))
{
_array[b-1][c]=f++;
if(f>_max)
goto end;
}else
_array[b-1][c]=0;
}

for(d=_num-e; d>=e; d--)//向上写
{
if(Iw(d,c+1,_num))
{
_array[d][c+1]=f++;
if(f>_max)
goto end;
}else
_array[d][c+1]=0;
}
}
end:
for(int i=0; i<_num+2 ; i++) //打印
{
for(int j=0; j<_num+2; j++)
{
if(_array[i][j]==0)
std::cout << " ";
else
std::cout << _array[i][j] <<" ";
}

std::cout << std::endl;

}
return 0;
}




哈哈 OK 啦 现在没错啦
Wolf_FienD 2007-11-13
  • 打赏
  • 举报
回复
啊 错了 不好意思 看错题了 当我没说
Wolf_FienD 2007-11-13
  • 打赏
  • 举报
回复

for(int i=0,j=0,x=1; i<_num+2; i++,j++)
{
if((i==0 && j==0) || (i==_num+1 && j==0) || (i==0 && j==_num+1) || (i==_num+1 && j==_num+1))
{
_array[i][j] =0;
continue;
}
_array[i][j]=x++;
}

for(int i=0,j=0; i<_num+2 ; i++,j++)
{
if(_array[i][j]==0)
std::cout << " " << std::endl;
else
std::cout << _array[i][j] << std::endl;
}


这是 写数 和 打印的代码
Wolf_FienD 2007-11-13
  • 打赏
  • 举报
回复
N= x

有 X^2 + 4X 个数

按 螺旋打印

用 2维 数组吧 写成一个 [X+2][X+2]的数组 在打印
lihao1111111111 2007-11-13
  • 打赏
  • 举报
回复
11楼的很牛啊!
Wolf_FienD 2007-11-13
  • 打赏
  • 举报
回复
LS的 算法 很妙 呵呵 用一个 数组来控制 转向

精妙 呵呵
Wolf_FienD 2007-11-13
  • 打赏
  • 举报
回复
LS 的牛 呵呵
Paradin 2007-11-13
  • 打赏
  • 举报
回复
输入10, 打印如下图形:


1 2 3 4 5 6 7 8 9 10
40 41 42 43 44 45 46 47 48 49 50 11
39 76 77 78 79 80 81 82 83 84 51 12
38 75 104 105 106 107 108 109 110 85 52 13
37 74 103 124 125 126 127 128 111 86 53 14
36 73 102 123 136 137 138 129 112 87 54 15
35 72 101 122 135 140 139 130 113 88 55 16
34 71 100 121 134 133 132 131 114 89 56 17
33 70 99 120 119 118 117 116 115 90 57 18
32 69 98 97 96 95 94 93 92 91 58 19
31 68 67 66 65 64 63 62 61 60 59 20
30 29 28 27 26 25 24 23 22 21


不知道是不是楼主的意思
Paradin 2007-11-13
  • 打赏
  • 举报
回复
考语言。
这个精简一点的:


#include <stdio.h>

int dij[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int n, turn, data;

int **init(void);
void print(int **arr);

int main()
{
int i, j, tot, data, k, **arr;
arr = init();
data = 1;
i = j = 0;
tot = n * n - 4;
arr[0][0] = -1;
for (k = 0; k < tot;)
{
i += dij[turn][0];
j += dij[turn][1];
if (i + j == 2 * n - 2 || (i * j == 0) && (i + j == n - 1))
turn = (turn + 1) % 4;
else
{
if (arr[i][j])
{
i -= dij[turn][0];
j -= dij[turn][1];
turn = (turn + 1) % 4;
}
else {arr[i][j] = data++; k++;}
}
}
arr[0][0] = 0;
print(arr);
return 0;
}

int** init()
{
int i, **arr;
scanf("%d", &n);
n += 2;
arr = (int**) malloc((n) * sizeof(int*));
for (i = 0; i < n; ++i)
{
arr[i] = (int*) malloc((n) * sizeof(int));
memset(arr[i], 0, n * sizeof(int));
}
return arr;
}


void print(int **arr)
{
int i, j;
for (i = 0; i < n; ++i)
{
for (j = 0; j < n; ++j)
if (arr[i][j]) printf("%4d ", arr[i][j]);
else printf("%4c ", ' ');
printf("\n");
}
}


细心就行。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧