思路:这道题本菜一开始确实没有什么头绪,知道是模拟而且对称,但是由于字符要么是.要么是$,感觉比较乱,
规律感觉无从下手。网上别人都说该题简单,但是我看代码还是看不懂~~~不过后来看到下面这张图以后就
豁然开朗了!(参考: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();
}
}
}
写着写着就感叹,真是高度对称啊!