如何打印以下图形!!
从键盘接受一个数字,然后输出图形。例如:(选做)
输入数字6,则输出:
1
2 15
3 16 14
4 17 21 13
5 18 19 20 12
6 7 8 9 10 11
问题点数:20、回复次数:21Top
1 楼leilei821006()回复于 2006-10-24 13:32:01 得分 0
没人知道吗??Top
2 楼Bennyatt()回复于 2006-10-24 13:52:41 得分 0
看出规律了。。。但是我不一定有时间给你编。
如果有时间一会就给你把代码贴上
Top
3 楼wanfustudio(雁南飞:知识之败,慕虚名而不务潜修也)回复于 2006-10-24 14:01:12 得分 0
感觉就是一个多重循环问题
可以申请一个动态的二维数组
比如已知6
就知道是什么结构了
再给每位置赋值,或者找规律通过计算赋值Top
4 楼Bennyatt()回复于 2006-10-24 14:05:22 得分 0
正写这个代码呢,很长时间不做C了
现在做的是PHP项目 。
忙里偷闲,个C的程序锻炼大脑。。。
Top
5 楼jixingzhong(瞌睡虫·星辰)回复于 2006-10-24 14:44:16 得分 0
请搜索 螺旋矩阵
这个三角矩阵是 螺旋矩阵的变体 而已Top
6 楼jixingzhong(瞌睡虫·星辰)回复于 2006-10-24 14:46:54 得分 5
一个 螺旋矩阵程序 :
#include <stdio.h>
#define N 8
main(){
int i,j,n=1,a[N][N];
for(i=0;i<=N/2;i++){
for(j=i;j<N-i;j++)
a[i][j]=n++;
for(j=i+1;j<N-i;j++)
a[j][N-i-1]=n++;
for(j=N-i-2;j>i;j--)
a[N-i-1][j]=n++;
for(j=N-i-1;j>i;j--)
a[j][i]=n++;
}
for(i=0;i<N;i++){
printf("\n\n");
for(j=0;j<N;j++)
printf("%5d",a[i][j]);
}
}Top
7 楼jixingzhong(瞌睡虫·星辰)回复于 2006-10-24 14:48:19 得分 0
http://tuxw.spaces.live.com/Blog/cns!1p1KRL2snDHMdTagFMfJCgKg!146.entry
============
PS : “本题解决方法很多,在 CSDN 看到 steedhorse(晨星) 写的一段代码...”
看来老大的影响力还是很大的 ~~~~~~Top
8 楼jixingzhong(瞌睡虫·星辰)回复于 2006-10-24 14:52:04 得分 0
这里有一个 上三角螺旋矩阵:
#include <iostream.h>
#include <iomanip.h>
#include <stdio.h>
#define m 20
#define h(i,j) ((2*c+2-i)*(i-1)/2+j-i+1) //二维数组中元素在一维数组中的位置
main()
{ int i=1,j=0,s=0,k,n,c;
int a[m*(m+1)/2+1];
a[1]=1;
printf("please input the number\n");
scanf("%d",&n); //这里输入 6 即可
c=n;
while(n>0)
{
for(k=1;k<=n;k++){j++;a[h(i,j)]=++s;}n--;//横向赋值
for(k=1;k<=n;k++){i++;a[h(i,j)]=++s;}n--;//纵向赋值
for(k=1;k<=n;k++){j--;i--;a[h(i,j)]=++s;}n--;//斜向赋值
}
k=0;
for(i=1;i<=c;i++)
for(j=1;j<=c;j++)
{
if(i>j)
cout<<setw(4)<<"0";
else
if(j==c){k++; cout<<setw(4)<<a[k]<<endl; } else {k++;cout<<setw(4)<<a[k];}
}
}
Top
9 楼buguty(系统级别)回复于 2006-10-24 15:16:44 得分 5
#include <stdio.h>
#include <windows.h>
void main(void)
{
int iLineNum;
int** iArry;
printf("请输入一个数字:\n");
scanf("%d", &iLineNum);
iArry = (int**)malloc(iLineNum*sizeof(int*));
for (int i=0; i<iLineNum; ++i)
{
iArry[i] = (int*)malloc(iLineNum*sizeof(int));
memset(iArry[i], 0, iLineNum*sizeof(int));
}
int iVal = 1;
int iLie = 0;
int iHan = -1;
int iLieAdd = 0;
int iHanAdd = 1;
int flag = 0;
for (int i=iLineNum; i>0; --i)
{
for (int j=1; j<=i; ++j)
{
iLie+=iLieAdd;
iHan+=iHanAdd;
iArry[iHan][iLie] = iVal;
++iVal;
}
switch(flag%3)
{
case 0:
iLieAdd = 1;
iHanAdd = 0;
++flag;
break;
case 1:
iLieAdd = -1;
iHanAdd = -1;
++flag;
break;
case 2:
iLieAdd = 0;
iHanAdd = 1;
++flag;
break;
}
}
printf("\n");
for (int i=0; i<iLineNum; ++i)
{
for (int j=0; j<i+1; ++j)
{
printf("%-3d", iArry[i][j]);
}
printf("\n");
}
}
在vc2005下调试通过。。。Top
10 楼buguty(系统级别)回复于 2006-10-24 15:19:01 得分 0
结果:
请输入一个数字:
10
1
2 27
3 28 26
4 29 45 25
5 30 46 44 24
6 31 47 54 43 23
7 32 48 55 53 42 22
8 33 49 50 51 52 41 21
9 34 35 36 37 38 39 40 20
10 11 12 13 14 15 16 17 18 19Top
11 楼buguty(系统级别)回复于 2006-10-24 15:33:19 得分 0
请输入一个数字:
20
1
2 57
3 58 56
4 59 105 55
5 60 106 104 54
6 61 107 144 103 53
7 62 108 145 143 102 52
8 63 109 146 174 142 101 51
9 64 110 147 175 173 141 100 50
10 65 111 148 176 195 172 140 99 49
11 66 112 149 177 196 194 171 139 98 48
12 67 113 150 178 197 207 193 170 138 97 47
13 68 114 151 179 198 208 206 192 169 137 96 46
14 69 115 152 180 199 209 210 205 191 168 136 95 45
15 70 116 153 181 200 201 202 203 204 190 167 135 94 44
16 71 117 154 182 183 184 185 186 187 188 189 166 134 93 43
17 72 118 155 156 157 158 159 160 161 162 163 164 165 133 92 42
18 73 119 120 121 122 123 124 125 126 127 128 129 130 131 132 91 41
19 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 40
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
Top
12 楼Bennyatt()回复于 2006-10-24 15:47:12 得分 10
我最近比较忙,刚弄出来了。
故意给你留了 几个问题让你解决哦,
而且明显还有几个多余的变量,你可以常识优化一下。
#include<stdio.h>
#include<iostream.h>
#include<iomanip.h>
int arr[100][100];
int tn,len,dn,un,rn;
int aa=1;
void opright(int x,int y);
void opup(int x,int y);
void opdown(int x,int y)
{
if(dn>=0)
{
for(int i=0;i<=dn;i++)
{
arr[x+i][y]=aa;
aa++;
len--;
if(len<=0)
{
break;
}
}
dn=dn-3;
opright(x+i-1,y+1);
}
}
void opright(int x,int y)
{
if(rn>=0)
{
for(int i=0;i<=rn;i++)
{
arr[x][y+i]=aa;
aa++;
len--;
if(len<=0)
{
break;
}
}
rn=rn-3;
opup(x-1,y+i-1-1);
}
}
void opup(int x,int y)
{
if(un>=0)
{
for(int i=0;i<=un;i++)
{
arr[x-i][y-i]=aa;
aa++;
len--;
if(len<=0)
{
break;
}
}
un=un-3;
opdown(x-i+1+1,y-i+1);
}
}
int getlen(int n)
{
if(n==1)
{
return(1);
}
else
{
return (n+getlen(n-1));
}
}
void main()
{
cin>>tn;
len=getlen(tn);
dn=tn-1;
rn=dn-1;
un=rn-1;
opdown(0,0);
for(int i=0;i<tn;i++)
{
for(int j=0;j<=tn;j++)
{
cout<<setw(4)<<arr[i][j]<<" ";
}
cout<<endl;
}
}Top
13 楼Bennyatt()回复于 2006-10-24 15:55:15 得分 0
我这个似乎最长。。。最通俗了。。。
嘿嘿,我忙去了Top
14 楼leilei821006()回复于 2006-10-24 16:47:22 得分 0
Bennyatt() ( ) 信誉:100 Blog
谢谢了
大家能说下思路吗?代码不是很重要了,先写过大家了Top
15 楼leilei821006()回复于 2006-10-24 16:50:28 得分 0
看了前面的代码,有点思路了。
是不通过控制 竖行,横行,斜行来打印出图形!!Top
16 楼buguty(系统级别)回复于 2006-10-24 17:15:10 得分 0
我的再改下。。。
for (int i=0; i<iLineNum; ++i)
{
iArry[i] = (int*)malloc((i+1)*sizeof(int));
memset(iArry[i], 0, (i+1)*sizeof(int));
}Top
17 楼buguty(系统级别)回复于 2006-10-24 17:19:01 得分 0
我的思路先:
比如我他的增长是从n,n-1,n-2...的长度然后转方向。所以我就用这种方法用数组来解决。当
1
2
3
4
5
6
的时候就是每次行数加一。列不加所以我就
当7 8 9 10 11的时候是行列加一。当。。。的时候就是行和列都减一。。。就是了Top
18 楼leilei821006()回复于 2006-10-25 01:28:06 得分 0
谢谢各位了!!
buguty(系统级别) ( ) 信誉:100
看了你的思路,使我尝试的也了个!!Top
19 楼leilei821006()回复于 2006-10-25 01:33:13 得分 0
/*从键盘接受一个数字,然后输出图形。例如:(选做)
输入数字6,则输出:
1
2 15
3 16 14
4 17 21 13
5 18 19 20 12
6 7 8 9 10 11
*/
#include<stdio.h>
int g_nArray[100][100] = {{0}}; //二维数组来存储数字
int g_nNum = 1; //输入的数字,进行累加
void Downwards(int nX,int nY, int nCount); //向下计算函数
void Rightward(int nX,int nY, int nCount); //向右计算函数
void Oblique(int nX,int nY, int nCount); //斜上计算函数
void main()
{
int nCount = 0; //打印数字的次数
while(1)
{
printf("请输入行数(1--20):");
scanf("%d", &nCount);
if(nCount > 20)
{
printf("输入的行数太大,屏幕无法显示,请重新输入!\n");
}
else
{
break;
}
}
Downwards(0, 0, nCount);
for(int nI=0; nI < nCount; nI++)//打印数组,如数据为0,则打印空格,其他输出
{ //数据
for(int nJ=0; nJ<nCount; nJ++)
{
if(g_nArray[nI][nJ] == 0)
{
printf(" ");
}
else
{
printf("%4d", g_nArray[nI][nJ]);
}
}
printf("\n");
}
}
void Downwards(int nX,int nY, int nCount) //向下计算函数
{
if(nCount > 0) //打印的个数大于0时,运行下列语句
{
for(int nI = 0; nI < nCount; nI++)
{
g_nArray[nX + nI][nY] = g_nNum;//列数不变,行数+1进行赋值
g_nNum++;
}
Rightward(nX + nI - 1, nY + 1, nCount - 1);//将下个点的起始位置传 } //输给Rightward()
} //下个点的起始位置为行
//数不变,列数+1
void Rightward(int nX,int nY, int nCount) //向右计算函数
{
if(nCount > 0)
{
for(int nI = 0; nI < nCount; nI++)
{
g_nArray[nX][nY + nI] = g_nNum;//行数不变,列数+1进行赋值
g_nNum++;
}
Oblique(nX - 1, nY + nI - 1 - 1, nCount - 1); //将下个点的起始位置
} //传输给Oblique()下个
} //点的起始位置为
//行数-1,列数-1
void Oblique(int nX,int nY, int nCount) //斜上计算函数
{
if(nCount > 0)
{
for(int nI = 0; nI < nCount; nI++)
{
g_nArray[nX - nI][nY - nI] = g_nNum;//行数-1,列数-1进行赋值
g_nNum++;
}
Downwards(nX - nI + 1 + 1, nY - nI + 1, nCount - 1);//将下个点的起 } //始位置传输给
} //Downwards()下
//个点的起始位置为行数+1,列数不变
Top
20 楼Bennyatt()回复于 2006-10-25 09:59:51 得分 0
好的我现在给大家说思路。。。。
我 5:30下班了就走人了。。。。家里电脑不能上网。
思路吗。。
首先我认为“画”这个图分三部分
1向下画
2向左画
3想斜上画
我们的存储实体就是 个二维数组,
我们就是要定义“画笔”如何走路,首先我们要通过实例观察分析
1
2 15
3 16 14
4 17 21 13
5 18 19 20 12
6 7 8 9 10 11
这个阵,
向下画的操作每次“画”的个数字是
1 2 3 4 5 6//// 16 17 18 //
向左画的操作每次“画”的个数字是
7 8 9 10 11///19 20//
向斜上画的操作每次“画”的个数字是
12 13 14 15//21
那么发现如下规律,其中每次递减的个数是3
所以呢我现在 用了三个函数
opright 向左画,opup向上画,opdown。。。。
8好了。。我的顶头上司来脆我了。。。。Top
21 楼Gxjun27168()回复于 2006-10-25 13:23:34 得分 0
解决的方法多了,关键是看谁的方法效率高,用的循环少。Top




