黑马程序员技术交流社区

标题: 阳哥的题-03 [打印本页]

作者: 存在感很差    时间: 2015-5-31 23:54
标题: 阳哥的题-03
今天做了阳哥专栏的一个题目,花了不少时间,但是做出来之后很有成就感。

打印如下图案:要求,通过输入不同的参数(比如1、2、3、4...N)该图案可以90°*N的倍数进行顺时针旋转。不需要图形化界面,在控制台中输出即可。注意:图中的“I”为占位符,真实的图形不应该有此符号。
     *
    ***
   *****
  *******
I*********
***********
I*********
  *******
   *****
    ***
     *

刚开始拿到这么题目,我无从下手,毕老师当时也讲过打印图案的,但是毕老师没让图案转起来啊,我醉了。不过我没有放弃,我自己先把图案打印了出来,然后开始想旋转的办法。太难了,太难了,我心里不止一次的对自己说。
后来我想到用数组,因为在草稿纸上看到旋转就是几个字符进行交换,而且很有规律,于是我就做出来了。
很激动,现在写的代码是以前完全看不懂的,这就是成长了吧。

  1. import java.util.*;
  2. /*
  3.         尝试用一个二维数组来进行存储需要打印的字符
  4.         进行旋转的时候只需要交换数组中的数据即可
  5. */
  6. class Test_03
  7. {
  8.         public static void main(String[] arguments){
  9.                 int NUM = 0;
  10.                 Scanner in = new Scanner(System.in);
  11.                 while(NUM%2==0){
  12.                         System.out.print("输入最大行数,必须为奇数:");
  13.                         NUM = in.nextInt();
  14.                 }
  15.                 char[][] ch = new char[NUM][NUM];
  16.                 System.out.print("输入顺时针旋转次数:");
  17.                 NUM = in.nextInt();
  18.                 init(ch);
  19.                 ch = rotate(ch,NUM);
  20.                 output(ch);
  21.         }

  22.         //初始化字符数组
  23.         static void init(char[][] ch){
  24.                 int max = ch.length/2;//max为最大行
  25.                 for(int i=0;i<max;i++){//初始化第零行到最大行
  26.                         for(int j=0;j<max-i;j++){
  27.                                 ch[i][j] = ' ';
  28.                         }
  29.                         for(int j=max-i;j<max+i+1;j++){
  30.                                 ch[i][j] = '*';
  31.                         }
  32.                         for(int j=max+i+1;j<ch.length;j++){
  33.                                 ch[i][j] = ' ';
  34.                         }
  35.                 }
  36.                 for(int i=0;i<ch.length;i++){//初始化最大行
  37.                         ch[max][i] = '*';
  38.                 }
  39.                 for(int i=max+1;i<ch.length;i++){//初始化最大行后面的所有行
  40.                         for(int j=0;j<i-max;j++){
  41.                                 ch[i][j] = ' ';
  42.                         }
  43.                         for(int j=i-max;j<ch.length+max-i;j++){
  44.                                 ch[i][j] = '*';
  45.                         }
  46.                         for(int j=ch.length+max-i;j<ch.length;j++){
  47.                                 ch[i][j] = ' ';
  48.                         }
  49.                 }
  50.                 ch[0][max] = '1';
  51.                 ch[max][0] = '2';
  52.                 ch[max][ch.length-1] = '3';
  53.                 ch[ch.length-1][max] = '4';
  54.         }
  55.         //打印整个字符数组
  56.         static void output(char[][] ch){
  57.                 for(int i=0;i<ch.length;i++){
  58.                         System.out.println(ch[i]);
  59.                 }
  60.         }
  61.         //旋转的方法
  62.         static char[][] rotate(char[][] ch,int x){
  63.                 char[][] chNew = new char[ch.length][ch.length];
  64.                 switch(x%4){
  65.                 case 0:
  66.                         chNew = ch;
  67.                         break;
  68.                 case 1:
  69.                         for(int i=0;i<ch.length;i++){
  70.                                 for(int j=0;j<ch.length;j++){
  71.                                         chNew[i][j] = ch[ch.length-j-1][i];
  72.                                 }
  73.                         }
  74.                         break;
  75.                 case 2:
  76.                         for(int i=0;i<ch.length;i++){
  77.                                 for(int j=0;j<ch.length;j++){
  78.                                         chNew[i][j] = ch[ch.length-i-1][ch.length-j-1];
  79.                                 }
  80.                         }
  81.                         break;
  82.                 case 3:
  83.                         for(int i=0;i<ch.length;i++){
  84.                                 for(int j=0;j<ch.length;j++){
  85.                                         chNew[i][j] = ch[j][ch.length-1-i];
  86.                                 }
  87.                         }
  88.                         break;
  89.                 }
  90.                 return chNew;
  91.         }
  92. }


  93. /*

  94. //初始化数组的改进版
  95.         static void init(char[][] ch){
  96.                 int max = ch.length/2;//max为最大行
  97.                 for(int i=0;i<ch.length;i++){
  98.                         for(int j=0;j<Math.abs(max-i);j++){
  99.                                 ch[i][j] = ' ';
  100.                         }
  101.                         for(int j=Math.abs(max-i);j<ch.length-Math.abs(max-i);j++){
  102.                                 ch[i][j] = '*';
  103.                         }
  104.                         for(int j=ch.length-Math.abs(max-i);j<ch.length;j++){
  105.                                 ch[i][j] = ' ';
  106.                         }
  107.                        
  108.                
  109.                 }
  110.         }

  111. */
复制代码

作者: 奋斗的黑马    时间: 2015-6-1 07:07
阳个也叫java基础吗?
作者: 半世心修    时间: 2015-6-1 08:06
打印菱形~
作者: 存在感很差    时间: 2015-6-1 08:40
奋斗的黑马 发表于 2015-6-1 07:07
阳个也叫java基础吗?

搞不清楚,不过他有发很多题目,给做出来的人技术分。
作者: 奋斗的黑马    时间: 2015-6-1 09:52
存在感很差 发表于 2015-6-1 08:40
搞不清楚,不过他有发很多题目,给做出来的人技术分。

流程走到哪一步了呢?
作者: 志行    时间: 2015-6-1 10:16
学习一下 最近挺想去面试的
作者: 存在感很差    时间: 2015-6-1 11:46
奋斗的黑马 发表于 2015-6-1 09:52
流程走到哪一步了呢?

我吗?还没开始走,正在自学中。
作者: 探索者    时间: 2015-6-1 12:26
题目还是蛮有意思

作者: 十字天堂    时间: 2015-6-1 12:55
不错,学习了
作者: 策马狂奔    时间: 2015-6-1 15:53
学习了           
作者: 大西洋    时间: 2015-6-1 19:36
这么长,恭喜!
作者: 人在旅途~东营    时间: 2015-6-1 22:47
有些难度啊,能独立做出来真厉害
作者: 存在感很差    时间: 2015-6-1 23:59
人在旅途~东营 发表于 2015-6-1 22:47
有些难度啊,能独立做出来真厉害

规律性挺强,多用几张草稿纸坚持一会还是有效果的,一起加油。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2