其他分享
首页 > 其他分享> > 蓝桥杯 打印十字图 笔记

蓝桥杯 打印十字图 笔记

作者:互联网

蓝桥杯 打印十字图 笔记

问题描述

小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:

..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..

对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。

输入格式

一个正整数 n (n<30) 表示要求打印图形的层数。

输出格式

对应包围层数的该标志。

样例输入1

1

样例输出1

..$$$$$..
..$...$..
$$$.$.$$$
$...$...$
$.$$$$$.$
$...$...$
$$$.$.$$$
..$...$..
..$$$$$..

样例输入2

3

样例输出2

..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..

解题

找出规律

..$$$$$..
.       .
$       $
$       $
$       $
$       $
$       $
.       .
..$$$$$..

 .$...$.
 $     $
 .     .
 .     .
 .     .
 $     $
 .$...$.
    
  $.$.$
  .   .
  $   $
  .   .
  $.$.$
    
   .$.
   $ $
   .$.
    
    $
..$$$$$$$$$$$$$..
.               .
$               $
$               $
$               $
$               $
$               $
$               $
$               $
$               $
$               $
$               $
$               $
$               $
$               $
.               .
..$$$$$$$$$$$$$..
    
 .$...........$.
 $             $
 .             .
 .             .
 .             .
 .             .
 .             .
 .             .
 .             .
 .             .
 .             .
 .             .
 .             .
 $             $
 .$...........$.
    
  $.$$$$$$$$$.$
  .           .
  $           $
  $           $
  $           $
  $           $
  $           $
  $           $
  $           $
  $           $
  $           $
  .           .
  $.$$$$$$$$$.$
    
   .$.......$.
   $         $
   .         .
   .         .
   .         .
   .         .
   .         .
   .         .
   .         .
   $         $
   .$.......$.
    
    $.$$$$$.$
    .       .
    $       $
    $       $
    $       $
    $       $
    $       $
    .       .
    $.$$$$$.$
    
     .$...$.
     $     $
     .     .
     .     .
     .     .
     $     $
     .$...$.
	 
      $.$.$
      .   .
      $   $
      .   .
      $.$.$
    
       .$.
       $ $
       .$.
    
        $

对比包裹1层和3层的分层图形

发现从

     .$...$.
     $     $
     .     .
     .     .
     .     .
     $     $
     .$...$.

开始就保持一致,而上一层的

    $.$$$$$.$
    .       .
    $       $
    $       $
    $       $
    $       $
    $       $
    .       .
    $.$$$$$.$

与包裹一层图形的最外层

    ..$$$$$..
    .       .
    $       $
    $       $
    $       $
    $       $
    $       $
    .       .
    ..$$$$$..

相比,差别只存在与四个顶点,并且我们还可以发现当我们将包裹一层的最外层顶点换为$后

$.$$$$$.$
.       .
$       $
$       $
$       $
$       $
$       $
.       .
$.$$$$$.$
    
 .$...$.
 $     $
 .     .
 .     .
 .     .
 $     $
 .$...$.
	 
  $.$.$
  .   .
  $   $
  .   .
  $.$.$
    
   .$.
   $ $
   .$.

    $

发现这些图形都满足一个规律,同一层除每行每列的第二和倒数第二个符号以外都是一样的,将这些符号换为相同符号后,图形就变为

$$$$$$$$$
$.......$
$.$$$$$.$
$.$...$.$
$.$.$.$.$
$.$...$.$
$.$$$$$.$
$.......$
$$$$$$$$$

这是一个容易打印的图形,所以我们已经达到了目的,通过分析发现,图形的层数为最中心的5层加上外面的包裹层数*4

代码

我们首先打印出这个同心矩阵

int n = sc.nextInt() * 4 + 5;
char[][] arr = new char[n][n];
char[] ch = {'$','.'};
int flag;
for (int i = 0; i <= n / 2 + 1; i++) {
	flag=i%2;
	for (int j = i; j <= n - 1 - i; j++)
		arr[i][j] = arr[j][i] = arr[n - 1 - i][j] = arr[j][n - 1 - i] = ch[flag];
}

我们通过将同一层除每行每列的第二和倒数第二个符号置换得到这个图形,所以现在我们将符号再次换回

int n = sc.nextInt() * 4 + 5;
char[][] arr = new char[n][n];
char[] ch = {'$','.','$'};
int flag;
for (int i = 0; i <= n / 2 + 1; i++) {
	flag=i%2;
	for (int j = i; j <= n - 1 - i; j++)
		arr[i][j] = arr[j][i] = arr[n - 1 - i][j] = arr[j][n - 1 - i] = ch[flag];
    if (i < n / 2)
		arr[i + 1][i] = arr[i][i + 1] = arr[n - 2 - i][i] = arr[n - i - 1][i + 1] = 
                arr[n - i - 1][n - i - 2] = arr[n - i - 2][n - i - 1] = arr[i][n - i - 2] = arr[i + 1][n - i - 1] = ch[flag+1];
}

最后,将四个顶点置换

arr[0][0] = arr[n - 1][0] = arr[0][n - 1] = arr[n - 1][n - 1] = '.';

标签:...,arr,..,int,.......,笔记,蓝桥,十字,...........
来源: https://www.cnblogs.com/alphafi/p/14613138.html