Test Message

d626: 小畫家真好用

內容

Windows 的小畫家真好用!
(至少在處理 PrintScreen 方面蠻快的…)
大家都知道
小畫家裡面有一種繪圖工具
叫做油漆桶工具
只要選定你要的顏色、油漆的地點就可以進行填色
油漆桶的填色範圍是取決於”同色塊相鄰”的原則
現在請你模擬這項工具


輸入

每個測資點只有一筆測資。
第一行有整數 n(1<=n<=100)表示這張圖的大小是(nn)個字元
接下來的 n 行,每行 n 個字元表示這張圖的樣子。
只有+、-兩種字元組成(兩種顏色的意思)
在最後一行,有兩個整數 i,j 表示油漆桶點擊的地點是第(i+1)列第(j+1)個字元,
[
假設有圖如下 3*3:
012
0---
1-+-
2-++
那麼 0,2 就表示這格:
012
0--\

1-+-
2-++
]
請視選取的顏色為+,選取的位置原本的顏色必為-
並且墨水只會利用上下左右四個方位擴散

7
-------
-+++---
-+--+--
-+---+-
--+++--
---++--
-------
3 4

輸出

請直接輸出經過油漆桶塗色後的圖案

-------
-+++---
-++++--
-+++++-
--+++--
---++--
-------


解題思路

用 dfs 從目標點開始遍歷所有可能,遇到'-'就將他改為'+‘\,遇到'+'則返回,遍歷完畢後輸出更新後的圖即可。

注意處理邊界問題。


完整程式碼

AC (2ms, 112KB)
#include <stdio.h>

char map[110][110];

void dfs(int r, int c)
{
if (map[r][c] == '+' || !map[r][c])
return;
map[r][c] = '+';
dfs(r, c + 1);
dfs(r + 1, c);
dfs(r, c - 1);
dfs(r - 1, c);
}

int main()
{
int n, r, c;
scanf(" %d", &n);
for (int i = 1; i <= n; i++)
scanf(" %s", map[i] + 1);
scanf(" %d %d", &r, &c);
dfs(r + 1, c + 1);
for (int i = 1; i <= n; i++)
puts(map[i] + 1);
return 0;
}