Printing Pattern Using Loops | HackerRank
题来自hackerrank 非常有趣的一道c语言回文图输出的题
我将用两张图 带您看明白解决该问题的两种思路
一.从一种不太直观的方法——减法法 开始认识这道题
1.程序的展示 以及c语言是逐行从左到右打印一定要明确
2.程序解释
拆一个变量为4时候的回文图 其实就能很清楚的认识到 减法法 各变量的含义
len=既是行数也是列数=一溜的坑位
col=固定行 某列=也是 列数
row=当前行数
m=挑 {当前行数、当前列数、坑位-当前行数-1、坑位-当前列数-1} 的最小值
n=回文图 外圈老大
最后输出的是 我们回文图 的老大减去老小
len-row-1 在一个不换行的循环里是不变的 所以就起着把边的作用
len-col-1 每一行倒着看 指4为0的一个作用
它俩综合可以整个1 就是绝对核心 1
二.方法二——非常清晰直观的 行列对比法
输出回文图:本质是行列博弈
比第一个 减法法 直观太多了!
这道题本质是 行号(zh)决定的输出数字:ph 和 列号(zl)决定的输出数字:pl 的一个对抗!
ph pl两者谁大取谁输出!
关于一些变量名称的说明:
zh :正向行序号h和反向行序号dh 的较大值
zl :正向行序号l和反向行序号dl 的较大值
zong:总共输出多少行和多少列
程序展示如下:
————————————————————————————————
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int max(int a,int b){
if(a>b) return a;
else return b;
}
int min(int c,int d){
if(c>d) return d;
else return c;
}
int main()
{
int n;
int h,l,dh,dl,p,zong,ph,pl,zh,zl;
scanf("%d", &n);
// Complete the code to print the pattern.
zong=2*n-1;
for(h=0;h<zong;h++)
{
for(l=0;l<zong;l++)
{ dh=zong-1-h;
dl=zong-1-l;
zh=min(h,dh);
zl=min(l,dl);
ph=n-zh;
pl=n-zl;
p=max(ph,pl);
printf("%d ",p);
}
printf("\n");
}
return 0;
}
三.评论区看到的其它思路
一个注解:什么是 abs
abs是 快速的判断 并赋值