HDOJ2074 叠筐

题目链接:叠筐

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


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

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;
		}
	}
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值