前言
简单问题,写的不好,大佬见谅.
如有疏漏,恳请指正,小编垂首.
问题描述:
给定"X",“O"的面板,要求将所有被"x"包围的"O"都转化为"X”.
问题解析:
- 正难则反
- 未被环绕的’O’一定有一个与整个棋盘的边界接壤
- 以边界的O为起点,向其他方向dfs遍历,遇到’X’和边界停止
- 所有被遍历到的都为’O
- 未被遍历的改为X
实现代码:
代码如下(示例):
#include<cstdio>
char c[10][10];
int h, l;//高,宽
void dfs(int i, int j) {
if (i >= 0 && i < h && j >= 0 && j < l && c[i][j]=='O') {//遇到O找上下左右
c[i][j] = 'A';//改为'A'避免重复遍历
dfs(i - 1, j);//left
dfs(i + 1, j);//right
dfs(i, j - 1);//on
dfs(i, j + 1);//down
}
return;//遇到边界,直接返回
}
void solve() {
for (int i = 0; i < h; i++) {//由边界向内找"O",必然是未被环绕的
dfs(i, 0);//第一列
dfs(i, l - 1);//最后一列
}
for (int j = 1; j < l; j++) {
dfs(0, j);//第一行
dfs(h - 1, j);//最后一行
}
for (int i = 0; i < h; i++) {
for (int j = 0; j < l; j++) {
if (c[i][j]=='A')c[i][j] = 'O';
else c[i][j] = 'X';
}
}
}
int main()
{
scanf_s("%d%d", &h, &l);
getchar();
for (int i = 0; i < h; i++) {
for (int j = 0; j < l; j++) {
scanf_s("%c", &c[i][j]);
}getchar();
}
solve();
printf("\n");
for (int i = 0; i < h; i++) {
printf("%s\n", c[i]);
}
return 0;
}
测试案例:
总结
正难则反