POJ1979 红与黑 DFS


这道题是我学了dfs之后用来强化这个思想的。就连我的水平也觉得这道题很水。


问题描述:

就像是小时候玩的吃豆子的游戏,上下左右走,然后统计一共能吃到多少个豆子。


算法思想:

其实跟POJ2386差不多,甚至更简单一些,因为这个题基本就是不需要遍历图,只是在起始点周围的四个地方开始运行DFS即可了。

能够正常AC,不知道有没有更快捷简便的方法。

那么需要做的就是记下来出发点,然后检测周围四个地方能不能走,如果能走的话就开始DFS函数,DFS函数中用递归做同样的事情。


代码部分:

#include 
#include 

using namespace std;
char field[22][22];
int n, m;
int result = 1;
int x, y;


void dfs(int a, int b) {
	field[a][b] = '#';
	result++;
	if (a - 1 > 0 && field[a - 1][b] == '.') {
		dfs(a - 1, b);
	}
	if (a + 1 <= n && field[a + 1][b] == '.') {
		dfs(a + 1, b);
	}
	if (b - 1 > 0 && field[a][b - 1] == '.') {
		dfs(a, b - 1);
	}
	if (b + 1 <= m && field[a][b + 1] == '.') {
		dfs(a, b + 1);
	}
}

int main() {
	while (cin >> m >> n) {
		if (n == 0 && m == 0) break;

		for (int i = 1; i <= n; ++i) {
			for (int j = 1; j <= m; ++j) {
				char s;
				cin >> s;
				if (s == '@') {
					x = i; y = j;
				}
				field[i][j] = s;
			}
		}

		field[x][y] = '#';
		if (x-1 > 0 && field[x - 1][y] == '.') {
			dfs(x - 1, y);
		}
		if (x + 1 <= n && field[x + 1][y] == '.') {
			dfs(x + 1, y);
		}
		if (y - 1 > 0 && field[x][y - 1] == '.') {
			dfs(x, y - 1);
		}
		if (y + 1 <= m && field[x][y + 1] == '.') {
			dfs(x, y + 1);
		}
		cout << result << endl;
		result = 1;
	}

	return 0;
}



总结:

这道题还是挺简单的,适合练DFS的前几道题吧。



你可能感兴趣的:(POJ,ACM,dfs)