题目地址:
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; } |