打印十字图 解题报告




思路:这道题本菜一开始确实没有什么头绪,知道是模拟而且对称,但是由于字符要么是.要么是$,感觉比较乱,

规律感觉无从下手。网上别人都说该题简单,但是我看代码还是看不懂~~~不过后来看到下面这张图以后就

豁然开朗了!(参考:http://blog.youkuaiyun.com/u013451048/article/details/43865259)


然后呢,就是代码的实现了。首先模拟中间画十字的过程,之后在模拟外面画边框的过程。我在主程序中

写单纯二重循环感觉头绪还是有点不清晰,所以干脆在外面又分了三个过程,分别实现已知中心点坐标画

十字,已知边界横着画,已知边界竖着画这几个功能,然后就不多说了,留给读者一点思考的余地啊,

可以参照下面的代码稍微研究研究~~~

import java.util.Scanner;

public class Main {
	static int n, size, mid, k;
	static char ch[][];
	static char nochar;

	private static void drawten(int x, int y) {
		for (int i = x - 2; i <= x + 2; i++)
			ch[i][y] = '$';
		for (int i = y - 2; i <= y + 2; i++)
			ch[x][i] = '$';
	}

	private static void xdraw(int x1, int x2, int y) {
		for (int i = x1; i <= x2; i++)
			ch[i][y] = '$';
	}

	private static void ydraw(int y1, int y2, int x) {
		for (int i = y1; i <= y2; i++)
			ch[x][i] = '$';
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner reader = new Scanner(System.in);
		n = reader.nextInt();
		size = (2 + 2 * n) * 2 + 1;
		ch = new char[size + 1][size + 1];
		mid = (size + 1) / 2;
		drawten(mid, mid);
		k = 2;
		for (int i = 1; i <= n; i++) {
			k += 2;
			ydraw(mid - (k - 2), mid + (k - 2), mid - k);
			ydraw(mid - (k - 2), mid + (k - 2), mid + k);
			xdraw(mid - (k - 2), mid + (k - 2), mid - k);
			xdraw(mid - (k - 2), mid + (k - 2), mid + k);
			ydraw(mid - k, mid - (k - 2), mid - (k - 2));
			ydraw(mid + (k - 2), mid + k, mid - (k - 2));
			ydraw(mid - k, mid - (k - 2), mid + (k - 2));
			ydraw(mid + (k - 2), mid + k, mid + (k - 2));
			xdraw(mid - k, mid - (k - 2), mid - (k - 2));
			xdraw(mid + (k - 2), mid + k, mid - (k - 2));
			xdraw(mid - k, mid - (k - 2), mid + (k - 2));
			xdraw(mid + (k - 2), mid + k, mid + (k - 2));
		}
		for (int i = 1; i <= size; i++) {
			for (int j = 1; j <= size; j++)
				if (ch[i][j] == '$')
					System.out.print('$');
				else
					System.out.print('.');
			System.out.println();
		}
	}

}
写着写着就感叹,真是高度对称啊!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值