荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: cycker (努力学习积分), 信区: Program
标 题: Re: 一个TC问题
发信站: 荔园晨风BBS站 (Mon Oct 21 19:22:42 2002), 站内信件
我也来凑一下热闹,基本上也就是根据转方向的条件:
1,行,列的下标是否还合法,是则变方向
2,下一个是否已经被“用过了”,是则变方向
虽然有点繁,但自已觉得比较直观
#include <iostream>
using namespace std;
#define N 4
int main()
{
int array[N][N]={0};
int hang=0;//行下标
int lei=0;//列下标
int n;//数组的递增的值
int d=1;//方向,共有四个,用d%4来表示
for(n=0;n<N*N;n++)
{
//cout<<"hang,lei="<<hang<<","<<lei<<" a="<<n+1<<" d= "<<d<<endl;
array[hang][lei]=n+1;
switch (d%4)
{
case 1:
lei++;
if(lei==N || array[hang][lei]!=0)
{
lei--;hang++;d++;
}
break;
case 2:
hang++;
if(hang==N || array[hang][lei]!=0)
{
hang--;lei--;d++;
}
break;
case 3:
lei--;
if(lei==-1 || array[hang][lei] !=0)
{
lei++;hang--;d++;
}
break;
case 0:
hang--;
if(hang==-1 || array[hang][lei] !=0)
{
hang++;lei++;d++;
}
break;
}
}
for(hang=0;hang<N;hang++)
{
for(lei=0;lei<N;lei++)
cout<<array[hang][lei]<<" ";
cout<<endl;
}
cin>>n;
}
【 在 tecky (...) 的大作中提到: 】
不用那么繁,这样就行了。
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define MAXN 20
void main()
{
int num[MAXN][MAXN]; /* 用来存放数字阵列(只用到左上角那
块)
*/
int step[4] = {1, MAXN, -1, -MAXN}; /* pos在阵列中移动的步长枚举值(代表
四个方
向) */
int i, j; /* 通用计数器 */
int n, n_sqr; /* 阶数及其平方 */
int pos = -1; /* 当前数字在阵列中应有的位置 */
int direction = 0; /* 当前行进方向(初值:向右) */
int count; /* 当前方向的维持次数 */
int flag = 1; /* count是否需要减一 */
/* 输入n(在1-20之内) */
printf("Please input n:(1-20) ");
scanf("%d", &n);
if (n<1 || n>20)
{
printf("Input error!\n");
getch();
exit(0);
}
/* 计算n阶阵列 */
n_sqr = n*n;
count = n;
for (i=1, j=count; i<=n_sqr; i++, j--)
{
if (!j) /* 该转方向了吗? */
{
direction = (++direction)%4; /* 方向以上、下、左、右循环
*/
if (flag) count--; /* 对该方向行进步数进行调整
*/
j = count; /* 初始化计数器 */
flag = !flag; /* 二值循环 */
}
pos += step[direction]; /* 数字i在阵列中应有的位置 */
*((int *)num+pos) = i;
}
/* 显示n阶阵列 */
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
printf("%3d ", num[i][j]);
printf("\n");
}
printf("\n");
getch();
}
如果还是不明白,看看下面这个图就很清楚了。^_^
1 2 3 4
------------------
12 | 13 14 | 5
|---------|
11 | 16 | 15 | 6
---------------|
10 9 8 | 7
【 在 bigone (survival.....) 的大作中提到: 】
: //我也弄了一个,大家参考参考:)
: #include <stdio.h>
: #include <conio.h>
: void main()
: {
: int allay[20][20];
: int x, y;
: int n;
: int TOP, BOTTOM, LEFT, RIGHT;
: int max_num, cur_num;
: int x_to, y_to;
: printf("input n:");
: scanf("%d",&n);
: max_num = n * n;
: cur_num = 1;
: TOP = 1;
: BOTTOM = n;
: LEFT = 1;
: RIGHT = n;
: x = 1;
: y = 1;
: while (1) {
: for (x_to = RIGHT,y_to = TOP; x <= x_to; x++) {
: allay[x][y] = cur_num;
: cur_num++;
: }
: TOP++;
: x--;
: y++;
: for (x_to = RIGHT,y_to = BOTTOM; y <= y_to; y++) {
: allay[x][y] = cur_num;
: cur_num++;
: }
: RIGHT--;
: y--;
: x--;
: for (x_to = LEFT,y_to = BOTTOM; x >= x_to; x--) {
: allay[x][y] = cur_num;
: cur_num++;
: }
: if (cur_num == max_num+1)
: break;
: BOTTOM--;
: x++;
: y--;
: for (x_to = LEFT,y_to = TOP; y >= y_to; y--) {
: allay[x][y] = cur_num;
: cur_num++;
: }
: LEFT++;
: y++;
: x++;
: }
: clrscr();
: for (y = 1;y <= n;y++){
: printf("\n\n");
: for(x = 1;x <= n;x++)
: printf("%4d",allay[x][y]);
: }
: getch();
: 【 在 lr (三戒) 的大作中提到: 】
: : 编写一C程序,对输出的正整数n(n<80),能构造并输出如下所示方阵(n=4时)
: : 1 2 3 4
: : 12 13 14 5
: : 11 16 15 6
: : 10 9 8 7
--
--
我匆匆的走入森林中 森林它郁葱葱
我找不到她的行踪 只看到那树摇风
我匆匆的走入森林中 森林它郁葱葱
我找不到她的行踪 只听得那南屏钟
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.36.220]
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店