HDOJ 2074 叠筐

题目地址:

http://acm.hdu.edu.cn/showproblem.php?pid=2074

思路,用二位数组保存,先把四个角补齐,最后再改。

例如题目的例子:

11 B A

————————————
 AAAAAAAAA
ABBBBBBBBBA
ABAAAAAAABA
ABABBBBBABA
ABABAAABABA
ABABABABABA
ABABAAABABA
ABABBBBBABA
ABAAAAAAABA
ABBBBBBBBBA
AAAAAAAAA

补齐后可以改为:

AAAAAAAAAAA
ABBBBBBBBBA
ABAAAAAAABA
ABABBBBBABA
ABABAAABABA
ABABABABABA
ABABAAABABA
ABABBBBBABA
ABAAAAAAABA
ABBBBBBBBBA
AAAAAAAAAAA

——————————–

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
 // Tanky Woo
// HDOJ 2074
// Accepted 2074 15MS 208K 1233B C++ Tanky Woo 
#include <iostream>
#include <cfloat>
#include <string>
using namespace std;
 
char arr[85][85];
int main()
{
	int nNum;
	char _mid, _out;   // _mid中间的字符, _out外面的字符
	bool Is_first = 1;  // 是否是第一个实例,若是,则不输出空行
	while(scanf("%d %c %c", &nNum, &_mid, &_out) != EOF)
	{
		if(!Is_first)
			printf("\n");
		Is_first = 0;
		memset(arr, 0, sizeof(arr));
		if(nNum == 1)     // 注意当n=1时,只输出中间的
		{
			printf("%c\n", _mid);
			continue;
		}
		arr[(nNum+1)/2][(nNum+1)/2] = _mid;
		int flag = 1;  // 输出外面 
		// 注意这里是从中间向外输出,现开始我以为外面便始终就是_out。错误~~
		for(int i=(nNum+1)/2-1; i>=1; --i)    
		{
			for(int j=i; j<=nNum-i+1; ++j)
			{
				if(flag)
				{
					arr[i][j] = _out;   // 上横行
					arr[j][i] = _out;   // 左竖行
					arr[j][nNum-i+1] = _out;   // 右竖行
					arr[nNum-i+1][j] = _out;   // 下横行
				}
				else
				{
					arr[i][j] = _mid;   // 上横行
					arr[j][i] = _mid;   // 左竖行
					arr[j][nNum-i+1] = _mid;   // 右竖行
					arr[nNum-i+1][j] = _mid;   // 下横行
				}
			}
			flag = !flag;
		}
		// 四个角改成空格
		arr[1][1] = ' ';
		arr[1][nNum] = ' ';
		arr[nNum][1] = ' ';
		arr[nNum][nNum] = ' ';
		for(int i=1; i<=nNum; ++i)
		{
			for(int j=1; j<=nNum; ++j)
				printf("%c", arr[i][j]);
			printf("\n");
		}
	}
	return 0;
}

发布者

Tanky Woo

Tanky Woo,[个人主页:https://tankywoo.com] / [新博客:https://blog.tankywoo.com]

发表评论

电子邮件地址不会被公开。 必填项已用*标注