2010年4月17日 星期六

Problem 11520 Fill the Square

此題要用英文填滿正方形方塊,鄰近英文字不能相同。

輸入測試資料次數後,讀入一個整數 n,是正方形的邊長。再接下來有 n 行 n 個字元要讀入,包含 '.' 或 'A' ~ 'Z',如果為 '.',則是你要填入的地方;如果為 'A' ~ 'Z',則是固定字元,而輸出也必須一樣。最後你要輸出整個方塊在「鄰近字元不能相同」的情況下,輸出一 n * n 英文正方形。

例如:
A.B.
.C.D
E.F.
.G.H
要輸出:
ADBA
BCAD
EAFA
AGAH

首先,可以建立一個二維陣列,以及讀入字元的方法,C 語言程式碼如下:
scanf("%d", &n);
for (i = 0; i < n; i ++)
scanf("%s", square[i]);
printf("Case %d:\n", t);

一開始我本來用 scanf("%c", &square[i][j]); 讀入字元,但發現他連換行都吃,所以我改用字串的方式讀取。接下來可以寫一 isSame(int row, int col, char ch) 函式,測試 ch 字元在 row 和 col 位置是否會與鄰近位置字元相同,如果相同,回傳 0;反之,回傳 1。 C 語言程式碼如下:
int isSame(int row, int col, char ch)
{
if (row != 0)
{
if (ch == square[row - 1][col])
return 0;
}
if (row != n)
{
if (ch == square[row + 1][col])
return 0;
}
if (col != 0)
{
if (ch == square[row][col - 1])
return 0;
}
if (col != n)
{
if (ch == square[row][col + 1])
return 0;
}
return 1;
}

最後只需利用 isSame 函式將每一個位置都傳入測試字元 ch 判斷(ch 初設為 'A'),如果沒有與鄰近重複,就填入字元;如果有與鄰近重複,ch 累加 1( ch + 1 等於 'B'),轉移為一下個字元判斷。C 語言程式碼如下:
for (i = 0; i < n; i ++, printf("\n"))
for (j = 0; j < n; j ++)
{
if (square[i][j] != '.')
{
printf("%c", square[i][j]);
continue;
}
else
{
for (k = 0; k < 26; k ++)
if (isSame(i, j, ch + k))
{
printf("%c", ch + k);
square[i][j] = ch + k;
break;
}
}
}

By David.K

p11520題目連結
回ACM題庫目錄
回首頁

沒有留言: