这篇博客是从旧博客 WordPress 迁移过来,内容可能存在转换异常。
题目地址:
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
// Tanky Woo
// HDOJ 2074
// Accepted 2074 15MS 208K 1233B C++ Tanky Woo
#include
#include
#include
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;
}