曼哈顿距离
#include <iostream>
using namespace std;
int main()
{
int n;
scanf("%d", &n);
for(int i=0;i<n;++i)
{
for(int j=0;j<n;++j)
{
if(abs(i-n/2)+abs(j-n/2)<=n/2) printf("*");
else printf(" ");
}
puts("");
}
return 0;
}
下面是我大一时候的弱智代码:(看看就得了)
//以下就是c代表字符,n代表三角的行数
//正三角模板
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n-i;j++)
printf(" ");
for(int k=1;k<=2*i-1;k++)
cout<<c;
cout<<endl;
}
//倒三角模板
for(int i=1;i<=n;i++)//行数 下面的空格和字母是一行 ,所以无论到到哪里都是先打印空格
{
for(int j=1;j<=i-1;j++)
printf(" ");
for(int k=1;k<=2*(n-i)+1;k++)//字符数
cout<<c;
cout<<endl;
}
//如果出先合并的问题,就把三角n变为n-1;i变成i+1 ,页就是少遍历一行,原来的行是之前的下一行
这个题就是把上面倒三角的n换成了n-1,i换成了i+1;
#include <iostream>
using namespace std;
int main()
{
int n;
char c;
while(cin>>c>>n)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n-i;j++)
printf(" ");
for(int k=1;k<=2*i-1;k++)
cout<<c;
cout<<endl;
}
for(int i=1;i<= n-1;i++)//行数 下面的空格和字母是一行 ,所以无论到到哪里都是先打印空格
{
for(int j=1;j<= i+1 -1;j++)
printf(" ");
for(int k=1;k<=2*( n - (i+1) ) +1;k++)//字符数
cout<<c;
cout<<endl;
}
}
}
//很多时候我们要通过一定的数学方法先求出n,判断这个三角有多少行
//沙漏问题,要先以3为数列的头,公差为2,最好记一下n(n+2), 然后因为对称,乘以2 最后加1 就是符号的总个数
int n = 0;
for (int i = 1; i < N; i++)
{
if ((2 * i * (i + 2) + 1) > N) {
n = i ;
break;
}
}
本来我以为套完模板就结束了,但是发现当N为1的时候,pat说最小测试错误,给了18分(总分20),所以需要特判一下
#include <iostream>
using namespace std;
int main()
{
int N;
char c;
cin>>N>>c;
if(N==1)
cout<<c<<endl<<0;
else
{
int n = 0;
for (int i = 1; i < N; i++) {
if ((2 * i * (i + 2) + 1) > N) {
n = i ;
break;
}
}
//倒三角模板
for(int i=1;i<=n;i++)//行数 下面的空格和字母是一行 ,所以无论到到哪里都是先打印空格
{
for(int j=1;j<=i-1;j++)
printf(" ");
for(int k=1;k<=2*(n-i)+1;k++)//字符数
cout<<c;
cout<<endl;
}
//正三角模板
//正三角模板 n和i 都要变哦
for(int i=1;i<=n-1;i++)
{
for(int j=1;j<=n-(i+1);j++)
printf(" ");
for(int k=1;k<=2*(i+1)-1;k++)
cout<<c;
cout<<endl;
}
//上面判断的是刚好不符合条件,所以会大一位 要把n变为n-1;
//if ((2 * i * (i + 2) + 1) > N)
//把i替换为n-1,带入这个判断式子中
cout<<( N - (2 * (n-1) * (n-1 + 2) + 1) );
}
}