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