题目链接:叠筐
这个题目还是挺有意思的,我做了很久,不过还是一次就过了。
分析题目以及题目所给的例子我们可以得出一些规律:
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/chb
if((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;
}
}
}