注册 登录
编程论坛 C++教室

这个图形 怎么打印出来

kldyutou 发布于 2010-01-10 17:36, 1785 次点击
21 打印以个N*N的方阵,N为每边字符的个数(3<N<20),要求最外层为"x",第二
层为“Y”,从第三层起每层依次打印数字0,1,2,3,...列子:当N=5,打印出下面的图
X X X X X
X Y Y Y X
X Y 0 Y X
X Y Y Y X
X X X X X
17 回复
#2
kspliusa2010-01-10 18:22
一行一行的打印呗,双重循环!想好怎样判断!
#3
kldyutou2010-01-11 17:41
回复 楼主 kldyutou
一行 一行的打印 好象不行吧  这样貌似 只能针对  5行的打印  如果是8行呢
#4
kspliusa2010-01-12 16:45
回复 3楼 kldyutou
我想这个只能一行一行打印,因为你不能让光标返回上一行再打印!每一行于每一列之间是有数学关系的。。。你自己找吧..
#5
流氓之父2010-01-12 20:58
e
#6
pangding2010-01-14 16:04
呵呵,有空我想想~
#7
风吹过b2010-01-14 21:14
5=
X X X X X
X Y Y Y X
X Y 0 Y X
X Y Y Y X
X X X X X
6=
X X X X X X
X Y Y Y Y X
X Y 0 0 Y X
X Y 0 0 Y X
X Y Y Y Y X
X X X X X X
7=
X X X X X X X
X Y Y Y Y Y X
X Y 0 0 0 Y X
X Y 0 1 0 Y X
X Y 0 0 0 Y X
X Y Y Y Y Y X
X X X X X X X
8=
X X X X X X X X
X Y Y Y Y Y Y X
X Y 0 0 0 0 Y X
X Y 0 1 1 0 Y X
X Y 0 1 1 0 Y X
X Y 0 0 0 0 Y X
X Y Y Y Y Y Y X
X X X X X X X X
9=
X X X X X X X X X
X Y Y Y Y Y Y Y X
X Y 0 0 0 0 0 Y X
X Y 0 1 1 1 0 Y X
X Y 0 1 2 1 0 Y X
X Y 0 1 1 1 0 Y X
X Y 0 0 0 0 0 Y X
X Y Y Y Y Y Y Y X
X X X X X X X X X
10=
X X X X X X X X X X
X Y Y Y Y Y Y Y Y X
X Y 0 0 0 0 0 0 Y X
X Y 0 1 1 1 1 0 Y X
X Y 0 1 2 2 1 0 Y X
X Y 0 1 2 2 1 0 Y X
X Y 0 1 1 1 1 0 Y X
X Y 0 0 0 0 0 0 Y X
X Y Y Y Y Y Y Y Y X
X X X X X X X X X X
11=
X X X X X X X X X X X
X Y Y Y Y Y Y Y Y Y X
X Y 0 0 0 0 0 0 0 Y X
X Y 0 1 1 1 1 1 0 Y X
X Y 0 1 2 2 2 1 0 Y X
X Y 0 1 2 3 2 1 0 Y X
X Y 0 1 2 2 2 1 0 Y X
X Y 0 1 1 1 1 1 0 Y X
X Y 0 0 0 0 0 0 0 Y X
X Y Y Y Y Y Y Y Y Y X
X X X X X X X X X X X
12=
X X X X X X X X X X X X
X Y Y Y Y Y Y Y Y Y Y X
X Y 0 0 0 0 0 0 0 0 Y X
X Y 0 1 1 1 1 1 1 0 Y X
X Y 0 1 2 2 2 2 1 0 Y X
X Y 0 1 2 3 3 2 1 0 Y X
X Y 0 1 2 3 3 2 1 0 Y X
X Y 0 1 2 2 2 2 1 0 Y X
X Y 0 1 1 1 1 1 1 0 Y X
X Y 0 0 0 0 0 0 0 0 Y X
X Y Y Y Y Y Y Y Y Y Y X
X X X X X X X X X X X X
13=
X X X X X X X X X X X X X
X Y Y Y Y Y Y Y Y Y Y Y X
X Y 0 0 0 0 0 0 0 0 0 Y X
X Y 0 1 1 1 1 1 1 1 0 Y X
X Y 0 1 2 2 2 2 2 1 0 Y X
X Y 0 1 2 3 3 3 2 1 0 Y X
X Y 0 1 2 3 4 3 2 1 0 Y X
X Y 0 1 2 3 3 3 2 1 0 Y X
X Y 0 1 2 2 2 2 2 1 0 Y X
X Y 0 1 1 1 1 1 1 1 0 Y X
X Y 0 0 0 0 0 0 0 0 0 Y X
X Y Y Y Y Y Y Y Y Y Y Y X
X X X X X X X X X X X X X
14=
X X X X X X X X X X X X X X
X Y Y Y Y Y Y Y Y Y Y Y Y X
X Y 0 0 0 0 0 0 0 0 0 0 Y X
X Y 0 1 1 1 1 1 1 1 1 0 Y X
X Y 0 1 2 2 2 2 2 2 1 0 Y X
X Y 0 1 2 3 3 3 3 2 1 0 Y X
X Y 0 1 2 3 4 4 3 2 1 0 Y X
X Y 0 1 2 3 4 4 3 2 1 0 Y X
X Y 0 1 2 3 3 3 3 2 1 0 Y X
X Y 0 1 2 2 2 2 2 2 1 0 Y X
X Y 0 1 1 1 1 1 1 1 1 0 Y X
X Y 0 0 0 0 0 0 0 0 0 0 Y X
X Y Y Y Y Y Y Y Y Y Y Y Y X
X X X X X X X X X X X X X X
15=
X X X X X X X X X X X X X X X
X Y Y Y Y Y Y Y Y Y Y Y Y Y X
X Y 0 0 0 0 0 0 0 0 0 0 0 Y X
X Y 0 1 1 1 1 1 1 1 1 1 0 Y X
X Y 0 1 2 2 2 2 2 2 2 1 0 Y X
X Y 0 1 2 3 3 3 3 3 2 1 0 Y X
X Y 0 1 2 3 4 4 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 4 4 3 2 1 0 Y X
X Y 0 1 2 3 3 3 3 3 2 1 0 Y X
X Y 0 1 2 2 2 2 2 2 2 1 0 Y X
X Y 0 1 1 1 1 1 1 1 1 1 0 Y X
X Y 0 0 0 0 0 0 0 0 0 0 0 Y X
X Y Y Y Y Y Y Y Y Y Y Y Y Y X
X X X X X X X X X X X X X X X
16=
X X X X X X X X X X X X X X X X
X Y Y Y Y Y Y Y Y Y Y Y Y Y Y X
X Y 0 0 0 0 0 0 0 0 0 0 0 0 Y X
X Y 0 1 1 1 1 1 1 1 1 1 1 0 Y X
X Y 0 1 2 2 2 2 2 2 2 2 1 0 Y X
X Y 0 1 2 3 3 3 3 3 3 2 1 0 Y X
X Y 0 1 2 3 4 4 4 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 4 4 4 3 2 1 0 Y X
X Y 0 1 2 3 3 3 3 3 3 2 1 0 Y X
X Y 0 1 2 2 2 2 2 2 2 2 1 0 Y X
X Y 0 1 1 1 1 1 1 1 1 1 1 0 Y X
X Y 0 0 0 0 0 0 0 0 0 0 0 0 Y X
X Y Y Y Y Y Y Y Y Y Y Y Y Y Y X
X X X X X X X X X X X X X X X X
17=
X X X X X X X X X X X X X X X X X
X Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y X
X Y 0 0 0 0 0 0 0 0 0 0 0 0 0 Y X
X Y 0 1 1 1 1 1 1 1 1 1 1 1 0 Y X
X Y 0 1 2 2 2 2 2 2 2 2 2 1 0 Y X
X Y 0 1 2 3 3 3 3 3 3 3 2 1 0 Y X
X Y 0 1 2 3 4 4 4 4 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 5 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 6 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 5 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 4 4 4 4 3 2 1 0 Y X
X Y 0 1 2 3 3 3 3 3 3 3 2 1 0 Y X
X Y 0 1 2 2 2 2 2 2 2 2 2 1 0 Y X
X Y 0 1 1 1 1 1 1 1 1 1 1 1 0 Y X
X Y 0 0 0 0 0 0 0 0 0 0 0 0 0 Y X
X Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y X
X X X X X X X X X X X X X X X X X
18=
X X X X X X X X X X X X X X X X X X
X Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y X
X Y 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Y X
X Y 0 1 1 1 1 1 1 1 1 1 1 1 1 0 Y X
X Y 0 1 2 2 2 2 2 2 2 2 2 2 1 0 Y X
X Y 0 1 2 3 3 3 3 3 3 3 3 2 1 0 Y X
X Y 0 1 2 3 4 4 4 4 4 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 5 5 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 6 6 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 6 6 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 5 5 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 4 4 4 4 4 3 2 1 0 Y X
X Y 0 1 2 3 3 3 3 3 3 3 3 2 1 0 Y X
X Y 0 1 2 2 2 2 2 2 2 2 2 2 1 0 Y X
X Y 0 1 1 1 1 1 1 1 1 1 1 1 1 0 Y X
X Y 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Y X
X Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y X
X X X X X X X X X X X X X X X X X X
19=
X X X X X X X X X X X X X X X X X X X
X Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y X
X Y 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Y X
X Y 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 Y X
X Y 0 1 2 2 2 2 2 2 2 2 2 2 2 1 0 Y X
X Y 0 1 2 3 3 3 3 3 3 3 3 3 2 1 0 Y X
X Y 0 1 2 3 4 4 4 4 4 4 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 5 5 5 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 6 6 6 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 6 7 6 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 6 6 6 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 5 5 5 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 4 4 4 4 4 4 3 2 1 0 Y X
X Y 0 1 2 3 3 3 3 3 3 3 3 3 2 1 0 Y X
X Y 0 1 2 2 2 2 2 2 2 2 2 2 2 1 0 Y X
X Y 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 Y X
X Y 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Y X
X Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y X
X X X X X X X X X X X X X X X X X X X
20=
X X X X X X X X X X X X X X X X X X X X
X Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y X
X Y 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Y X
X Y 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 Y X
X Y 0 1 2 2 2 2 2 2 2 2 2 2 2 2 1 0 Y X
X Y 0 1 2 3 3 3 3 3 3 3 3 3 3 2 1 0 Y X
X Y 0 1 2 3 4 4 4 4 4 4 4 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 5 5 5 5 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 6 6 6 6 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 6 7 7 6 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 6 7 7 6 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 6 6 6 6 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 5 5 5 5 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 4 4 4 4 4 4 4 3 2 1 0 Y X
X Y 0 1 2 3 3 3 3 3 3 3 3 3 3 2 1 0 Y X
X Y 0 1 2 2 2 2 2 2 2 2 2 2 2 2 1 0 Y X
X Y 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 Y X
X Y 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Y X
X Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y X
X X X X X X X X X X X X X X X X X X X X

这是我算出来的结果
#8
风吹过b2010-01-14 21:18
我只会VB6,所以看到这个题目,就用VB6做了一下.
我的VB6的代码如下,然后那位牛人随手改成 C 的代码.

我加了大量的注释在内.VB6 的注释是 ' 开头,到本行结尾为止.
可以占一行,也可以从代码本行里 再接注释
VB6运行中文名当函数和变量名,所以里面一些函数名和变量名都是中文的.

----------------VB6代码---------------------
Private Sub Command1_Click()
'响应按钮处理的过程
Dim n As Long
Dim s As String

'输入部分,要求输入一个5-20的数,超范围则退出过程
s = InputBox("请输入 N : 5-20", 5)
If IsNumeric(s) Then
    n = CLng(s)
    If n < 5 And n > 20 Then
        MsgBox "数据范围不对"
        Exit Sub
    End If
Else
    MsgBox "请输入数据"
    Exit Sub
End If

'处理部分
Dim i As Long
Dim j As Long

Dim k As String

'FOR 循环 ,N 为总层数
For i = 1 To n
    Select Case i       '多分支选择
        Case 1, n       '第一层,最后一层
            k = 重复字串("X ", n)       '全成 X
        Case 2, n - 1       '第二层及倒数第二层,由头,尾(均为 X ) 和中间(Y)组成
            k = "X " & 重复字串("Y ", n - 2) & "X "
        Case Else           '其它层,由 头 和 内层数字 和 尾 组成
            k = "X Y " & 产生内套字串(i, n) & "Y X "
    End Select
    Print k             '输出一行
Next i

End Sub


Private Function 重复字串(字串 As String, 次数 As Long) As String
'根据传进来的参数,使用FOR循环重次连接成一个新的字符串
'如果换到C里面的话,应该是先申请内存,然后用 FOR 循环填数字进去
Dim i As Long
For i = 1 To 次数
    重复字串 = 重复字串 & 字串
Next i
End Function

Private Function 产生内套字串(当前层数 As Long, 总层数 As Long) As String
Dim i As Long
Dim j As Long
Dim k1 As String, k2 As String

'如果传进去的当前层数大于半数,则需要修正为从底部计算起的层数
If 当前层数 < 总层数 / 2 + 1 Then
    j = 当前层数
Else
    j = 总层数 - 当前层数 + 1
End If

'使用FOR 产生头和层部分
'如果是C里面,可以申请内存,然后从头和从尾填数字进去
For i = 0 To j - 4
    k1 = k1 & i & " "
    k2 = i & " " & k2
Next i

'产生中间部分的字串,然后与头和层拼起来
'中间层个数的计算是 头,尾各用掉了 j-3),还有去掉2个 X Y 层, 就变成了
'总个数- XY层个数-头-尾
'最后连接起来

    产生内套字串 = k1 & 重复字串(CStr(j - 3) & " ", 总层数 - 4 - (j - 3) * 2) & k2
End Function
#9
freeforever2010-01-20 16:01
static void Main(string[] args)
        {
            char[,] sAry = (new char[20,20]);
            char[] ch = {'X','Y','O'};
            int size = 0;
            string sin = Console.ReadLine();
            int.TryParse(sin, out size);
            int ires = size / 2;
            int loop = ires + size % 2;
            int iCnt = 0;
            for (int j = 0; j < loop; ++j)
            {
                char chr = ch[iCnt % ch.Length];
                int x = size - j - 1;
                sAry[j, x] =
                sAry[x, j] = chr;
                sAry[j, j] = chr;
                sAry[x, x] = chr;
                for (int k = j + 1; k < x; ++k)
                {
                    sAry[j, k] = chr;
                    sAry[k, j] = chr;
                    sAry[k, x] = chr;
                    sAry[x, k] = chr;
                }
                iCnt++;
            }
            for (int i = 0; i < size; ++i)
            {
                for (int j = 0; j < size; ++j)
                {
                    Console.Write(sAry[i, j]);
                }
                Console.WriteLine();
            }
            Console.ReadLine();
        }
#10
freeforever2010-01-20 16:08
晕哈,没好好看题,我的是这个样子:

10
X X X X X X X X X X
X Y Y Y Y Y Y Y Y X
X Y O O O O O O Y X
X Y O X X X X O Y X
X Y O X Y Y X O Y X
X Y O X Y Y X O Y X
X Y O X X X X O Y X
X Y O O O O O O Y X
X Y Y Y Y Y Y Y Y X
X X X X X X X X X X
#11
cnfarer2010-01-20 19:14
并不复杂啊!因为有规律可循啊。下面程序在VS2005 C++中通过。
#include <iostream>
void main()
{
    int num=20;  //num:3~20 这个数字表示矩阵 把下面的21改掉,可以出来更大的图形
    int i=1;
    int j=num;
    int k='X';
    int l=1;
    int m=1;
    char prnt[21][21];
    for (i=1;i<=j;i++,j--)
    {
        for (l=i;l<=j;l++)
        {
            prnt[i][l]=k;
            prnt[l][i]=k;
            prnt[l][j]=k;
            prnt[j][l]=k;
        }
        k++;
        if (k=='Z')
            k='0';
    }
    for (i=1;i<=num;i++)
    {
        for (l=1;l<=num;l++)
        {
            printf("%c ",prnt[i][l]);
        }
        printf("\n\r");
    }
    getchar();
}

[ 本帖最后由 cnfarer 于 2010-1-20 20:24 编辑 ]
#12
cnfarer2010-01-20 19:23
回复 7楼 风吹过b
真有面耐心啊!!!
#13
xingfeng06232010-01-20 22:35
为什么是prnt[21][21]?
#14
cnfarer2010-01-21 08:03
这个并不重要,20也可以,但下面的循环得从0开始。(个人习惯而已)
#15
_DaNciNg_2010-01-30 23:56
不知道楼主还会不会注意
我的想法是这样的
观察这个图形的特点,正方形的,圆心对称
所以可以按照这个,由对角线分成4份,然后只要写出一个三角形的函数就可以了,而且,这个三角形的函数还是非常好写的
再根据矩阵坐标变换的规律,就可以做出整个图了吧。
还有,不知道11楼的做法可以做出不,不知道楼主试了没,如果有的话 ,麻烦告诉我一声。
#16
无诲今生2010-01-31 12:05
下边我用递归写了个,没编译过,思路基本这样,你可以改一下
#include<stdio.h>
const int i=0;
static char c='X';
char a[30][30];
void func(char a[30][30],int ln,int rn,int ln1,int rn1)//ln和rn是左上角坐标,ln1和rn是右下角坐标
{
int j;
for(j=0;j<rn1-rn;j++)
a[ln][rn+j]=c+(i++);
for(j=0;j<rn1-rn;j++)
a[ln1][rn+j]=c+(i++);
for(j=0;j<ln1-ln;j++)
a[ln+j][rn]=c+(i++);
for(j=0;j<ln1-ln;j++)
a[ln+j][[rn1]=c+(i++);
if(c=='Y')c='0';
if(ln<ln1&&rn<rn1)
func(a,ln+1,rn+1,ln1-1,rn1-1)
}
void main()
{
int n,k,m;
printf("请输入N值:");
scanf("%d",&n);
func(a,0,0,n-1,n-1);
for(k=0;k<n;k++)
for(m=0;m<n;m++)
printf("%d ",a[k][m]);
printf("\n");
}

#17
无诲今生2010-01-31 12:10
修改一下:const int i=0;改成static int i=0;
if(c=='Y')c='0';改成if((c+i)=='Y'){c='0';i=0;}


#18
pangding2010-01-31 19:53
以下是引用pangding在2010-1-14 16:04:23的发言:

呵呵,有空我想想~
有点事过境迁了,不过最近还是有空了。所以編了一下,不能食言嘛。
其实很容易:
程序代码:

#include <stdio.h>

int main(int argc, char *argv[])
{
    char cs[] = "XY0123456789";
    int n, i, j;

    scanf("%d", &n);
    if (n < 3 || n > 20) return 1;

    for (i = 0; i < n; ++i)
    {
        for (j = 0; j < n; ++j)
            if (j < i)
                printf("%c ", cs[j+i < n ? j : n-i-1]);
            else
                printf("%c ", cs[j+i < n ? i : n-j-1]);

        putchar('\n');
    }

    return 0;
}

1