图像显示---算法集

  • 特定图型描述:

问题描述
编写一个程序,首先输入一个整数,例如 5,然后在屏幕上显示如下的图形(5 表
示行数):
$ $ $ $ $
$ $ $ $
$ $ $
$ $
$

#include<iostream>
using namespace std;

int main()
{
  int i,j,n;
  cin>>n;
  for(i=0;i<n;i++)
  {
  	for(j=0;j<n-i;j++)
  	cout<<"*"<<" ";
  	cout<<endl;
  }
  return 0;
}
  • 输出C字母图形:
#include<iostream>
#include<cmath>
using namespace std;

int main()
{
  int x,m;
  double y;
  for(y=10;y>=-10;y--)
  {
  	m=2.9*sqrt(100-y*y);
  	for(x=1;x<30-m;x++)
  	cout<<" ";
  	cout<<"*"<<endl;
  }
  return 0;
}
  • 巴斯卡三角形:
#include<iostream>
#include<cstdio>
#define N 12//会输出13行,更改会输出相应的N+1行 
using namespace std;

long blaise(int n,int r)
{
	int i;
	long p=1;
	for(i=1;i<=r;i++)
	p=p*(n-i+1)/i;//p=p*(n-i+1)/i和p*=(n-i+1)/i是不一样的比如1000*2/4=500和1000*(2/4)=0结果完全不一样!
	return p;
} 
void print()
{
	int n,r,t;
	for(n=0;n<=N;n++)
	{
		for(r=0;r<=n;r++)
		{
			int i;
			if(r==0)
			{
				for(i=0;i<=(N-n);i++)
				cout<<"   ";
			}
			else
			{
		       cout<<"   ";
		    }
		    printf("%3d",blaise(n,r));//经典C语言的某些语句在特定情况下是难以被替代的!
		}
		cout<<endl;
	}
}
int main()
{
  print();
  return 0;
}
  • 十字图:
    几个说明:
    1 . 整个图形: n = 1的时候是9行,2的时候是13行,3的时候是17行,列相同,所以为边长4 * n + 5的正方形 .
    2 . 设输入的值为n,设置基准点(0,0),从外往里先输出最外圈。然后基准点依次往下往右移动2位,重复输出外圈,直到输完n圈。(这里要多循环一次,即 n+1次循环,来输出中间的十字)
    3 .下面代码注释是基于当n = 3 时的图 :
    在这里插入图片描述
#include<iostream>
using namespace std;
char s[150][150];
int main(){
	int n, x, y;
	cin>>n;
	x = 0; y = 0;       //基准点(0,0) 
	for (int i = 0; i < 4 * n + 5; i++){
		for (int j = 0; j < 4 * n + 5; j++){
			s[i][j] = '.';										//用'.'表示整个图形,是边长为4 * n + 5的正方形 
		}
	}
	for (int i = 0; i < n + 1; i++){			
		for (int j = y + 2; j < y + 4 * (n - i)  + 2; j++){
			s[x][j] = '$';										//最外圈第一行的'$',(0,2)->(0,14) 
		}
		for (int j = x; j <= x + 2; j++){
			s[j][y + 2] = '$';									// 第三列三行的'$',(0、2)、(1、2)、(2、2) 
		}
		for (int j = x; j <= x + 2; j++){						//对称的另一边的'$',列是从4 * (n - i) + 2开始 
			s[j][y + 4 * (n - i) + 2] = '$';
		}
		for (int j = y; j <= y + 2; j++){		
			s[x + 2][j] = '$';									//第三行前三个'$' 
		}
		for (int j = y + 4 *(n - i) + 2; j <= y + 4 * (n - i) + 4; j++){
			s[x + 2][j] ='$';									//第三行对称的'$' 
		}
		for (int j = x + 2; j <= x + 4 * (n - i) + 2; j++){
			s[j][y] = '$';									   //从第三行到第十五行第一列的'$' 
		}
		for (int j = x + 2; j <= x + 4 * (n - i) + 2; j++){
			s[j][y + 4 * (n - i) + 4] = '$';				  //对称的,第十七列 
		}
		for (int j = y; j <= y + 2; j++){
			s[x + 4 * (n - i) + 2][j] = '$';							
		}
		for (int j = y + 4 * (n - i) + 2; j <= y + 4 * (n - i) + 4; j++){
			s[x + 4 * (n - i) + 2][j] = '$';
		}
		for (int j = x + 4 * (n - i) + 2; j <= x + 4 * (n - i) + 4; j++){
			s[j][y + 2] = '$';
		}
		for (int j = x + 4 * (n - i) + 2; j <= x + 4 * (n - i) + 4; j++){
			s[j][y + 4 * (n - i) + 2] = '$';
		}
		for (int j = y + 2; j <= y + 4 * (n - i) + 2; j++){
			s[x + 4 * (n - i) + 4][j] = '$';
		}
		x += 2;	y += 2;				//基准点为(2,2)、(4、4)...... (n,n) 
	}
	for (int i = 0; i < 4 * n + 5; i++){
		cout<<s[i]<<endl; 			//输出'$'					
	}
	return 0;
}

总结:图像显示类的题非常考验一个人的逻辑思考和推理能力,有些还涉及不常见的数学公式,较为复杂的图像处理题处理起来还是比较麻烦的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值