HDOJ2074 叠筐

来源:互联网 发布:linux编译android源码 编辑:程序博客网 时间:2024/06/06 00:29

题目链接:叠筐

这个题目还是挺有意思的,我做了很久,不过还是一次就过了。


分析题目以及题目所给的例子我们可以得出一些规律:

1)输出的字符是一圈一圈的,并且内圈外圈交替

2)行数line 是奇数,输入的第一个字符总是在中间


要让他在中间,可以找到这样的规律,line+1=:(假设输入11 A B)

如果A在最外面一层:2,6,10....

如果B在最外面一层:4,8,12...

也就是line+1%4 == 0与line+1%4 != 0的区别了

(我是在前面使用了交换的方式,具体参考代码)


3)

为了看起来好看些,先写出这个line = 5的例子(还没去掉角)

AAAAA
ABBBA
ABABA
ABBBA
AAAAA

我们可以把问题分成两部分来看

第一部分是

AAAAA
ABBB
ABA
AB
A

第二部分是(X代表已经有了的,第二部分不考虑)

XXXXX
XXXXA
XXXBA
XXBBA
XAAAA

到这里,我们就可以轻易想到用char[ ][ ]来存储数据

先将他全部设为空格,然后设置第一部分,然后是第二部分,最后是处理角的问题

当然,题目要求每个案例之间有个空行,我们可以使用开关来控制,也就是我下面代码的boo,具体看代码


下面AC代码:

import java.util.Scanner;public class Main{private static Scanner scanner;public static void main(String[] args) {scanner = new Scanner(System.in);boolean boo = false;while (scanner.hasNext()) {int line = scanner.nextInt();// 行数String a = scanner.next();String b = scanner.next();char cha = a.charAt(0);char chb = b.charAt(0);//if...交换cha/chbif((line+1)%4 == 0){char c = cha;cha = chb;chb = c;}char[][] ch = new char[line + 1][line + 1];for (int i = 0; i < ch.length; i++) {for (int j = 0; j < ch.length; j++) {ch[i][j] = ' ';}}if(boo){System.out.println();}// 控制上半部分int count = ch.length;for (int i = 1; i < ch.length; i++) {// 控制对角线--ch[i][i]for (int j = i; j < count; j++) {if (i % 2 != 0) {ch[i][j] = cha;ch[j][i] = cha;} else {ch[i][j] = chb;ch[j][i] = chb;}}count--;}/* * AAAAA  * ABBB  * ABA  * AB  * A */count = ch.length-1;for (int i = ch.length-1; i > ch.length-ch.length/2; i--) {for (int j = i; j > ch.length-count; j--) {if (i % 2 != 0) {ch[i][j] = cha;ch[j][i] = cha;} else {ch[i][j] = chb;ch[j][i] = chb;}}count--;}// 将角去掉(行数大于1的时候才去掉)if (line>1) {ch[1][1] = ' ';ch[1][ch.length - 1] = ' ';ch[ch.length - 1][1] = ' ';ch[ch.length - 1][ch.length - 1] = ' ';}// 打印for (int i = 1; i < ch.length; i++) {for (int j = 1; j < ch.length; j++) {System.out.print(ch[i][j]);}System.out.println();}boo = true;}}}



原创粉丝点击