http://acm.hdu.edu.cn/showproblem.php?pid=2074
錯(cuò)誤思路:每一次輸出一個(gè)字符绢涡,根據(jù)條件判斷牲剃,交換兩個(gè)字符,在第一行不交換雄可,第二行前后共交換兩次凿傅,以此類推,在中間那一行達(dá)到每輸出一個(gè)字符就交換一次数苫。
出現(xiàn)問題:無(wú)法擬定一個(gè)正確的公式來(lái)滿足交換規(guī)律聪舒,難度較高。
正確思路:將疊框拆分成一個(gè)個(gè)小框虐急,用字符數(shù)組將其儲(chǔ)存起來(lái)箱残,每一個(gè)框存入數(shù)組后進(jìn)行字符交換
代碼如下:
#include<stdio.h>
#include<string.h>
int main()
{
int t, i, j,k,q=1;
char n, m, temp;
char a[100000];
while (scanf("%d %c %c", &t, &n, &m) != EOF)
{
if (t % 2 == 0 || t < 1 || t>79) break;
if (q != 1) printf("\n");//為了滿足輸出格式要求,需要在每一個(gè)疊框之間輸出換行止吁。
if ((t / 2 + 1) % 2 == 1)//因?yàn)橐獜淖钔饷嬉蝗﹂_始存入被辑,需要判斷最外圈的字符是n還是m燎悍,默認(rèn)是m,如果不是就交換兩個(gè)字符敷待。
{
temp = m;
m = n;
n = temp;
}
for (i = 0; i < t/2+1; i++)//一共有多少圈间涵,計(jì)算圈數(shù)
{
for (j = i; j <t-i; j++)//列仁热,不難發(fā)現(xiàn)榜揖,第二個(gè)框會(huì)從第i個(gè)位置開始,然后在t-i的位置結(jié)束
{
for (k = i; k < t-i; k++)//行同上抗蠢。
{
a[j*t+k] = m;//字符在數(shù)組里举哟,根據(jù)其行列位置進(jìn)行儲(chǔ)存
}
}
temp = m;//儲(chǔ)存后字符交換
m = n;
n = temp;
}
a[0] = ' ';//將四個(gè)角字符替換成空格
a[t-1] = ' ';
a[t*(t - 1)] = ' ';
a[t*t-1] = ' ';
for (i = 1; i <=t*t; i++)
{
printf("%c", a[i-1]);
if (i % t== 0&&i!=0) printf("\n");
}
q++;
}
}
經(jīng)過對(duì)比,與網(wǎng)絡(luò)上標(biāo)準(zhǔn)答案輸出結(jié)果一模一樣迅矛。