如何使用C++打印下面宫格?

rjzou2006 2018-05-21 07:00:31
| 1 | 3 | 4 | 10 | 11 |
| 2 | 5 | 9 | 12 | 19 |
| 6 | 8 | 13 | 18 | 20 |
| 7 | 14 | 17 | 21 | 24 |
| 15 | 16 | 22 | 23 | 25 |

图片
















...全文
775 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
donjin9 2018-05-23
  • 打赏
  • 举报
回复
#include <stdio.h>
#define N 5
void main() {
    int v[N][N] = { 0 };
    int count = 0;
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j <= i; ++j) {
            if (i % 2 == 0)
                v[j][i - j] = ++count;
            else
                v[i - j][j] = ++count;
        }
    }
    for (int i = 1; i < N; ++i) {
        for (int j = i; j < N; ++j) {
            if ((N - i) % 2 == 0)
                v[N + i - 1 - j][j] = ++count;
            else
                v[j][N + i - 1 - j] = ++count;
        }
    }
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            printf("|  %-3d", v[i][j]);
        }
        printf("|\n");
    }
    getchar();
}
赵4老师 2018-05-22
  • 打赏
  • 举报
回复
赵4老师 2018-05-22
  • 打赏
  • 举报
回复
仅供参考:
//定义一个m行n列的数组,比如3行4列
// 1  2  4  7
// 3  5  8 10
// 6  9 11 12
#include <stdio.h>
#include <conio.h>
int a[20][20];
int m,n;
int x,y;
int d;
void find_first_0(int *fx,int *fy) {
    int i,j;

    *fx=0;
    *fy=0;
    for (i=0;i<m;i++) {
        for (j=0;j<n;j++) {
            if (0==a[i][j]) {
                *fx=j;
                *fy=i;
                return;
            }
        }
    }
}
void main() {
    printf("Input m(1..20),n(1..20):");
    scanf("%d,%d",&m,&n);
    if (m<1 || 20<m || n<1 || 20<n) return;
    for (y=0;y<m;y++) for (x=0;x<n;x++) a[y][x]=0;
    d=1;
    x=0;
    y=0;
    while (1) {
        a[y][x]=d;
        d++;
        while (1) {
            x--;
            if (x<0) break;
            y++;
            if (y>=m) break;
            a[y][x]=d;
            d++;
        }
        find_first_0(&x,&y);
        if (0==x && 0==y) break;
    }
    for (y=0;y<m;y++) {
        for (x=0;x<n;x++) {
            printf("%2d ",a[y][x]);
        }
        printf("\n");
    }
    getch();
}
rjzou2006 2018-05-22
  • 打赏
  • 举报
回复
帮忙看下,在在线等。在在线等。在在线等。在在线等。在在线等。在在线等。在在线等。在在线等。在在线等。在在线等。在在线等。
rjzou2006 2018-05-22
  • 打赏
  • 举报
回复
左斜对角线数字是顺序排列的。
百合杰 2018-05-22
  • 打赏
  • 举报
回复
二维数组 按规律写逻辑
AlbertS 2018-05-22
  • 打赏
  • 举报
回复
引用 9 楼 zhao3132453 的回复:
[quote=引用 8 楼 shihengzhen101 的回复:] [quote=引用 7 楼 shihengzhen101 的回复:] 本来感觉挺简单的,写的时候发现边界条件很容易错,下面是代码,结果符合要求


#include <stdio.h>
#include <stdlib.h>

// 正方形最大边长
#define MAX_LEN	10

// 就是从左下角向右上角填充数组即可
// 填充完成后按格式打印
int main(int argc, char* argv[])
{
	int array[MAX_LEN][MAX_LEN] = {0};
	const int edge_length = 5;
	int count = 0;

	// 左上角
	for (int i = 0; i < edge_length; ++i)
	{
		for(int j = 0; j <= i; j++)
		{
			array[i-j][j] = ++count;
		}

	}

	// 右下角
	for (int i = 1; i < edge_length; ++i)
	{
		for(int j = i; j < edge_length; j++)
		{
			array[j][edge_length + i - 1 - j] = ++count;
		}
	}

	// 按格式输出
	for (int i = 0; i < edge_length; ++i)
	{
		for(int j = 0; j < edge_length; j++)
		{
			printf("|%4d", array[i][j]);
		}
		printf("|\n");
	}

	return 0;
}
输出结果
不好意思,好像反了,还需要调整下 [/quote] 还是反的~ 应该是s型递增,也就是上边说的蛇形矩阵[/quote]嗯 需要调整下
半雨微凉丶 2018-05-22
  • 打赏
  • 举报
回复
引用 8 楼 shihengzhen101 的回复:
[quote=引用 7 楼 shihengzhen101 的回复:] 本来感觉挺简单的,写的时候发现边界条件很容易错,下面是代码,结果符合要求


#include <stdio.h>
#include <stdlib.h>

// 正方形最大边长
#define MAX_LEN	10

// 就是从左下角向右上角填充数组即可
// 填充完成后按格式打印
int main(int argc, char* argv[])
{
	int array[MAX_LEN][MAX_LEN] = {0};
	const int edge_length = 5;
	int count = 0;

	// 左上角
	for (int i = 0; i < edge_length; ++i)
	{
		for(int j = 0; j <= i; j++)
		{
			array[i-j][j] = ++count;
		}

	}

	// 右下角
	for (int i = 1; i < edge_length; ++i)
	{
		for(int j = i; j < edge_length; j++)
		{
			array[j][edge_length + i - 1 - j] = ++count;
		}
	}

	// 按格式输出
	for (int i = 0; i < edge_length; ++i)
	{
		for(int j = 0; j < edge_length; j++)
		{
			printf("|%4d", array[i][j]);
		}
		printf("|\n");
	}

	return 0;
}
输出结果
不好意思,好像反了,还需要调整下 [/quote] 还是反的~ 应该是s型递增,也就是上边说的蛇形矩阵
AlbertS 2018-05-22
  • 打赏
  • 举报
回复
引用 7 楼 shihengzhen101 的回复:
本来感觉挺简单的,写的时候发现边界条件很容易错,下面是代码,结果符合要求


#include <stdio.h>
#include <stdlib.h>

// 正方形最大边长
#define MAX_LEN	10

// 就是从左下角向右上角填充数组即可
// 填充完成后按格式打印
int main(int argc, char* argv[])
{
	int array[MAX_LEN][MAX_LEN] = {0};
	const int edge_length = 5;
	int count = 0;

	// 左上角
	for (int i = 0; i < edge_length; ++i)
	{
		for(int j = 0; j <= i; j++)
		{
			array[i-j][j] = ++count;
		}

	}

	// 右下角
	for (int i = 1; i < edge_length; ++i)
	{
		for(int j = i; j < edge_length; j++)
		{
			array[j][edge_length + i - 1 - j] = ++count;
		}
	}

	// 按格式输出
	for (int i = 0; i < edge_length; ++i)
	{
		for(int j = 0; j < edge_length; j++)
		{
			printf("|%4d", array[i][j]);
		}
		printf("|\n");
	}

	return 0;
}
输出结果
不好意思,好像反了,还需要调整下
AlbertS 2018-05-22
  • 打赏
  • 举报
回复
本来感觉挺简单的,写的时候发现边界条件很容易错,下面是代码,结果符合要求


#include <stdio.h>
#include <stdlib.h>

// 正方形最大边长
#define MAX_LEN 10

// 就是从左下角向右上角填充数组即可
// 填充完成后按格式打印
int main(int argc, char* argv[])
{
int array[MAX_LEN][MAX_LEN] = {0};
const int edge_length = 5;
int count = 0;

// 左上角
for (int i = 0; i < edge_length; ++i)
{
for(int j = 0; j <= i; j++)
{
array[i-j][j] = ++count;
}

}

// 右下角
for (int i = 1; i < edge_length; ++i)
{
for(int j = i; j < edge_length; j++)
{
array[j][edge_length + i - 1 - j] = ++count;
}
}

// 按格式输出
for (int i = 0; i < edge_length; ++i)
{
for(int j = 0; j < edge_length; j++)
{
printf("|%4d", array[i][j]);
}
printf("|\n");
}

return 0;
}


输出结果
tony2278 2018-05-21
  • 打赏
  • 举报
回复
应该是一个算法?找到一个公式来表达数字之间的关系?然后编程打印?

64,674

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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