深度优先搜索之 nkoj2221

来开始写一点有技术性的东西---〉搜索

nkoj 2221是一道可以使用深度优先搜索来完成的题目,按照往常一样,我依然还是用了想象中的内存,很不开心

对于DFS的题目,我觉得对时间不需要太多的考虑,主要是内存方面会暴掉,这道题还好,max_n==100

所以就算是申请char file[max_n][max_n];也不过是100*100*1=10000kb的内存

但是有些题目就比较变态了,比如1<n,m<10^10之类的就不是那么好申请内存了

(10^10)*(10^10)=10^20.......so large!

这时候需要对坐标进行离散化处理,将那些没用的空白地方过滤掉,这在后面我在专门写一篇吧。

/***************************************************/

  time:0ms

  memory:1312kb

/**************************************************/

 

//经典深度搜索问题
#include<iostream>
#define max_n_m 101
using namespace std;
char maze[max_n_m][max_n_m];
int n, m;
int dx[12] = {-2,-1,-1,-1,0,0,0,0,1,1,1,2};
int dy[12] = {0,-1,0,1,-2,-1,1,2,-1,0,1,0};
//从坐标(x,y)开始将是同一个图形的消掉
//'-' 代表暗点,‘#’表示亮点
void DFS(int x,int y)
{
	maze[x][y] = '-';
	//根据曼哈顿距离来深度搜索
	for (int i = 0; i <12; i++){
			int nx = x + dx[i],ny = y + dy[i];
			if (nx >= 0 && nx < max_n_m&&ny >= 0 && ny < max_n_m&&maze[nx][ny] == '#'){
				DFS(nx, ny);
			}
	}
}
int main()
{
	while (cin >> n >> m){
		//input
		for (int i = 0; i < n; i++){
			for (int j = 0; j < m; j++){
				cin >> maze[i][j];
			}
		}
		//solve
		int ans = 0;
		for (int i = 0; i < n; i++){
			for (int j = 0; j < m; j++){
				if (maze[i][j] == '#'){
					DFS(i, j);
					ans++;
				}
			}
		}
		cout << ans << endl;
	}
	return 0;
}


 

你可能感兴趣的:(算法,博客,计算机,ACM,nkoj)