来开始写一点有技术性的东西---〉搜索
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;
}