打印一个N*N的矩阵

fj97897217 2011-03-28 04:44:54
c语言编程.任意输入一个数字N,打印一个N*N的矩阵,这个矩阵最外圈为1,每往内一圈,数字加1。
例如:1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
这是5的矩阵!
...全文
1026 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-03-30
  • 打赏
  • 举报
回复
闲来无事又写了一个模拟画图的算法。应该算比较好理解的版本了。
//c语言编程.任意输入一个数字N(1<=N<=18),打印一个N*N的矩阵,这个矩阵最外圈为1,每往内一圈,数字加1。
#include <stdio.h>
#include <stdlib.h>
char M[19][19];
int N,n,y,x,i;
void main() {
while (1) {
printf("\nInput N(1..18):");
if (1==scanf("%d",&N)) {
if (1<=N && N<=18) break;
}
}
//为测试1~18结果的正确性,忽略输入的N。
for (n=1;n<=18;n++) {
printf("------%d-------\n",n);
for (i=1;i<=n;i++) {
y=i ;for (x=i;x<=n+1-i;x++) M[y][x]=i;
y=n+1-i;for (x=i;x<=n+1-i;x++) M[y][x]=i;
x=i ;for (y=i;y<=n+1-i;y++) M[y][x]=i;
x=n+1-i;for (y=i;y<=n+1-i;y++) M[y][x]=i;
}
for (y=1;y<=n;y++) {
for (x=1;x<=n;x++) {
printf("%d",M[y][x]);
}
printf("\n");
}
}
}
//
//Input N(1..18):1
//------1-------
//1
//------2-------
//11
//11
//------3-------
//111
//121
//111
//------4-------
//1111
//1221
//1221
//1111
//------5-------
//11111
//12221
//12321
//12221
//11111
//------6-------
//111111
//122221
//123321
//123321
//122221
//111111
//------7-------
//1111111
//1222221
//1233321
//1234321
//1233321
//1222221
//1111111
//------8-------
//11111111
//12222221
//12333321
//12344321
//12344321
//12333321
//12222221
//11111111
//------9-------
//111111111
//122222221
//123333321
//123444321
//123454321
//123444321
//123333321
//122222221
//111111111
//------10-------
//1111111111
//1222222221
//1233333321
//1234444321
//1234554321
//1234554321
//1234444321
//1233333321
//1222222221
//1111111111
//------11-------
//11111111111
//12222222221
//12333333321
//12344444321
//12345554321
//12345654321
//12345554321
//12344444321
//12333333321
//12222222221
//11111111111
//------12-------
//111111111111
//122222222221
//123333333321
//123444444321
//123455554321
//123456654321
//123456654321
//123455554321
//123444444321
//123333333321
//122222222221
//111111111111
//------13-------
//1111111111111
//1222222222221
//1233333333321
//1234444444321
//1234555554321
//1234566654321
//1234567654321
//1234566654321
//1234555554321
//1234444444321
//1233333333321
//1222222222221
//1111111111111
//------14-------
//11111111111111
//12222222222221
//12333333333321
//12344444444321
//12345555554321
//12345666654321
//12345677654321
//12345677654321
//12345666654321
//12345555554321
//12344444444321
//12333333333321
//12222222222221
//11111111111111
//------15-------
//111111111111111
//122222222222221
//123333333333321
//123444444444321
//123455555554321
//123456666654321
//123456777654321
//123456787654321
//123456777654321
//123456666654321
//123455555554321
//123444444444321
//123333333333321
//122222222222221
//111111111111111
//------16-------
//1111111111111111
//1222222222222221
//1233333333333321
//1234444444444321
//1234555555554321
//1234566666654321
//1234567777654321
//1234567887654321
//1234567887654321
//1234567777654321
//1234566666654321
//1234555555554321
//1234444444444321
//1233333333333321
//1222222222222221
//1111111111111111
//------17-------
//11111111111111111
//12222222222222221
//12333333333333321
//12344444444444321
//12345555555554321
//12345666666654321
//12345677777654321
//12345678887654321
//12345678987654321
//12345678887654321
//12345677777654321
//12345666666654321
//12345555555554321
//12344444444444321
//12333333333333321
//12222222222222221
//11111111111111111
//------18-------
//111111111111111111
//122222222222222221
//123333333333333321
//123444444444444321
//123455555555554321
//123456666666654321
//123456777777654321
//123456788887654321
//123456789987654321
//123456789987654321
//123456788887654321
//123456777777654321
//123456666666654321
//123455555555554321
//123444444444444321
//123333333333333321
//122222222222222221
//111111111111111111
fj97897217 2011-03-30
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zhao4zhong1 的回复:]
闲来无事又写了一个模拟画图的算法。应该算比较好理解的版本了。

C/C++ code
//c语言编程.任意输入一个数字N(1<=N<=18),打印一个N*N的矩阵,这个矩阵最外圈为1,每往内一圈,数字加1。
#include <stdio.h>
#include <stdlib.h>
char M[19][19];
int N,n,y,x,i;
void main() {
……
[/Quote]
非常感谢!!能加你的qq吗?不懂的好问你!! 呵呵~~
赵4老师 2011-03-29
  • 打赏
  • 举报
回复
可见N=1..18时都是1位数
赵4老师 2011-03-29
  • 打赏
  • 举报
回复
//------18-------
//111111111111111111
//122222222222222221
//123333333333333321
//123444444444444321
//123455555555554321
//123456666666654321
//123456777777654321
//123456788887654321
//123456789987654321
//123456789987654321
//123456788887654321
//123456777777654321
//123456666666654321
//123455555555554321
//123444444444444321
//123333333333333321
//122222222222222221
//111111111111111111
//------19-------
// 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
// 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1
// 1 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 1
// 1 2 3 4 4 4 4 4 4 4 4 4 4 4 4 4 3 2 1
// 1 2 3 4 5 5 5 5 5 5 5 5 5 5 5 4 3 2 1
// 1 2 3 4 5 6 6 6 6 6 6 6 6 6 5 4 3 2 1
// 1 2 3 4 5 6 7 7 7 7 7 7 7 6 5 4 3 2 1
// 1 2 3 4 5 6 7 8 8 8 8 8 7 6 5 4 3 2 1
// 1 2 3 4 5 6 7 8 9 9 9 8 7 6 5 4 3 2 1
// 1 2 3 4 5 6 7 8 910 9 8 7 6 5 4 3 2 1
// 1 2 3 4 5 6 7 8 9 9 9 8 7 6 5 4 3 2 1
// 1 2 3 4 5 6 7 8 8 8 8 8 7 6 5 4 3 2 1
// 1 2 3 4 5 6 7 7 7 7 7 7 7 6 5 4 3 2 1
// 1 2 3 4 5 6 6 6 6 6 6 6 6 6 5 4 3 2 1
// 1 2 3 4 5 5 5 5 5 5 5 5 5 5 5 4 3 2 1
// 1 2 3 4 4 4 4 4 4 4 4 4 4 4 4 4 3 2 1
// 1 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 1
// 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1
// 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
赵4老师 2011-03-29
  • 打赏
  • 举报
回复
纠正:
不是
N=1..9
而是
N=1..17

//------17-------
//11111111111111111
//12222222222222221
//12333333333333321
//12344444444444321
//12345555555554321
//12345666666654321
//12345677777654321
//12345678887654321
//12345678987654321
//12345678887654321
//12345677777654321
//12345666666654321
//12345555555554321
//12344444444444321
//12333333333333321
//12222222222222221
//11111111111111111

fj97897217 2011-03-29
  • 打赏
  • 举报
回复
int a1 = i > (n-i-1) ? (n-i-1) : i;//i可看做该元素离左边(a[n][0])的距离;n-i-1 是该元素离右边的距离;a1为他们两个中较小的一个,即水平方向离边界的最近距离
int a2 = j > (n-j-1) ? (n-j-1) : j;//同理a2为该元素离竖直方向边界的最小距离
……
[/Quote]
不是我喜欢看哈!!呵呵,遇到了!谢谢了哈!!
luciferisnotsatan 2011-03-29
  • 打赏
  • 举报
回复
断楼。
Ulfsaar 2011-03-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fj97897217 的回复:]
...
[/Quote]
int a1 = i > (n-i-1) ? (n-i-1) : i;//i可看做该元素离左边(a[n][0])的距离;n-i-1 是该元素离右边的距离;a1为他们两个中较小的一个,即水平方向离边界的最近距离
int a2 = j > (n-j-1) ? (n-j-1) : j;//同理a2为该元素离竖直方向边界的最小距离
int nMax = a1 > a2 ? a2 : a1;//这地方应该叫做nMin,为该元素离边界的最近距离

没想到你喜欢看复杂的程序...
fj97897217 2011-03-28
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <math.h>
void main()
{
int n;
int nMax;
while(scanf("%d",&n))
{
if (n <= 0)
{
break;
}

for (int i=0; i<n; ++i)
{
for (int j=0; j<n; ++j)
{
int a1 = i > (n-i-1) ? (n-i-1) : i;
int a2 = j > (n-j-1) ? (n-j-1) : j;
int nMax = a1 > a2 ? a2 : a1;
printf("%d", nMax+1);
}
printf("\n");
}
}
}

能详解吗??谢谢了!能力有限!
FlySky_OSG 2011-03-28
  • 打赏
  • 举报
回复

这只是一个简单的循环,建议自己动手完成~
赵4老师 2011-03-28
  • 打赏
  • 举报
回复
//c语言编程.任意输入一个数字N,打印一个N*N的矩阵,这个矩阵最外圈为1,每往内一圈,数字加1。
#include <stdio.h>
#include <stdlib.h>
int N,n,L,i,M;
void main() {
while (1) {
printf("\nInput N(1..9):");
if (1==scanf("%d",&N)) {
if (1<=N && N<=9) break;
}
}
//为测试1~9结果的正确性,忽略输入的N。
for (n=1;n<=9;n++) {
printf("------%d-------\n",n);
if (1==(n%2)) {
for (L=0;L<n/2;L++) {
for (i=0;i<n/2;i++) {
M=__min(L,i);
printf("%d",M+1);
}
for (i=n/2;i>=0;i--) {
M=__min(L,i);
printf("%d",M+1);
}
printf("\n");
}
for (L=n/2;L>=0;L--) {
for (i=0;i<n/2;i++) {
M=__min(L,i);
printf("%d",M+1);
}
for (i=n/2;i>=0;i--) {
M=__min(L,i);
printf("%d",M+1);
}
printf("\n");
}
} else {
for (L=0;L<n/2;L++) {
for (i=0;i<n/2;i++) {
M=__min(L,i);
printf("%d",M+1);
}
for (i=n/2-1;i>=0;i--) {
M=__min(L,i);
printf("%d",M+1);
}
printf("\n");
}
for (L=n/2-1;L>=0;L--) {
for (i=0;i<n/2;i++) {
M=__min(L,i);
printf("%d",M+1);
}
for (i=n/2-1;i>=0;i--) {
M=__min(L,i);
printf("%d",M+1);
}
printf("\n");
}
}
}
}
//
//Input N(1..9):1
//------1-------
//1
//------2-------
//11
//11
//------3-------
//111
//121
//111
//------4-------
//1111
//1221
//1221
//1111
//------5-------
//11111
//12221
//12321
//12221
//11111
//------6-------
//111111
//122221
//123321
//123321
//122221
//111111
//------7-------
//1111111
//1222221
//1233321
//1234321
//1233321
//1222221
//1111111
//------8-------
//11111111
//12222221
//12333321
//12344321
//12344321
//12333321
//12222221
//11111111
//------9-------
//111111111
//122222221
//123333321
//123444321
//123454321
//123444321
//123333321
//122222221
//111111111
xzjxylophone 2011-03-28
  • 打赏
  • 举报
回复
可以结贴了~~
Ulfsaar 2011-03-28
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <math.h>
void main()
{
int n;
int nMax;
while(scanf("%d",&n))
{
if (n <= 0)
{
break;
}

for (int i=0; i<n; ++i)
{
for (int j=0; j<n; ++j)
{
int a1 = i > (n-i-1) ? (n-i-1) : i;
int a2 = j > (n-j-1) ? (n-j-1) : j;
int nMax = a1 > a2 ? a2 : a1;
printf("%d", nMax+1);
}
printf("\n");
}
}
}
masmaster 2011-03-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 fj97897217 的回复:]
c语言编程.任意输入一个数字N,打印一个N*N的矩阵,这个矩阵最外圈为1,每往内一圈,数字加1。
例如:1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
这是5的矩阵!
[/Quote]

http://bbs.bccn.net/thread-334835-1-2.html

69,337

社区成员

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

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