题目类型: 搜索
样例输入:
1 1 * 3 5 *@*@* **@** *@*@* 1 8 @@****@* 5 5 ****@ *@@*@ *@**@ @@@*@ @@**@ 0 0
样例输出:
0 1 2 2
分析:
这一题可以说是搜索中最基础的一题之一。 要找出相连在一起的有多少块, 因此, 依次枚举,遇到@时就进行搜索,用深搜,广搜都行,目的是把相连的@都标记为已访问。
下面给出用DFS(深搜)和BFS(广搜)的代码
DFS 1 :递推
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
int m,n,idx[105][105];
char pic[105][105];
void dfs(int r,int c,int id)
{
if (r<0 || r>=m || c<0 || c>= n) return ;
if(idx[r][c] >0 || pic[r][c] != '@') return ;
idx[r][c] = id;
for (int dr = -1;dr <= 1;dr++)
{
for (int dc = -1;dc <= 1;dc++)
{
if(dr != 0 || dc != 0)
dfs(r+dr,c+dc,id);
}
}
}
int main()
{
int i,j,cnt;
while (cin>>m>>n,m&&n)
{
for (i=0;i<m;i++)
{
cin>>pic[i];
}
cnt = 0;
memset(idx,0,sizeof(idx));
for (i=0;i<m;i++)
{
for (j=0;j<n;j++)
{
if(idx[i][j]==0 && pic[i][j] == '@')
dfs(i,j,++cnt);
}
}
cout<<cnt<<endl;
}
return 0;
}这种方法当数据量很大时,可能会有栈溢出
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <stack>
using namespace std;
int m,n,idx[105][105];
char pic[105][105];
struct Node {int x;int y;};
stack<Node> st;
void dfs(int r,int c)
{
// if (r<0 || r>=m || c<0 || c>= n) return ;
// if(idx[r][c] >0 || pic[r][c] != '@') return ;
while(!st.empty()) st.pop();
Node temp;
temp.x = r;
temp.y = c;
st.push(temp);
idx[r][c] = 1;
while (!st.empty())
{
temp = st.top();
st.pop();
for (int dr = -1;dr <= 1;dr++)
{
for (int dc = -1;dc <= 1;dc++)
{
int drr = dr+temp.x;
int dcc = dc+temp.y;
if((dr != 0 || dc != 0) && drr>=0 && drr<m && dcc>=0 && dcc<n && pic[drr][dcc] == '@' && !idx[drr][dcc])
// dfs(r+dr,c+dc,id);
{
Node t;
idx[drr][dcc] =1;
t.x = drr;
t.y = dcc;
st.push(t);
}
}
}
}
}
int main()
{
int i,j,cnt;
while (cin>>m>>n,m&&n)
{
for (i=0;i<m;i++)
{
cin>>pic[i];
}
cnt = 0;
memset(idx,0,sizeof(idx));
for (i=0;i<m;i++)
{
for (j=0;j<n;j++)
{
if(idx[i][j]==0 && pic[i][j] == '@')
{
cnt++;
dfs(i,j);
}
}
}
cout<<cnt<<endl;
}
return 0;
}
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <stack>
#include <queue>
using namespace std;
int m,n,idx[105][105];
char pic[105][105];
struct Node {int x;int y;};
//stack<Node> st;
//queue<Node> st;
Node que[105];
void dfs(int r,int c)
{
// if (r<0 || r>=m || c<0 || c>= n) return ;
// if(idx[r][c] >0 || pic[r][c] != '@') return ;
//while(!st.empty()) st.pop();
que[0].x = r;
que[0].y = c;
idx[r][c] = 1;
int front=0;
int rear=1;
while (front < rear)
{
Node temp=que[front++];
for (int dr = -1;dr <= 1;dr++)
{
for (int dc = -1;dc <= 1;dc++)
{
int drr = dr+temp.x;
int dcc = dc+temp.y;
if((dr != 0 || dc != 0) && drr>=0 && drr<m && dcc>=0 && dcc<n && pic[drr][dcc] == '@' && !idx[drr][dcc])
{
idx[drr][dcc] =1;
que[rear].x = drr;
que[rear].y = dcc;
rear++;
}
}
}
}
}
int main()
{
int i,j,cnt;
while (cin>>m>>n,m&&n)
{
for (i=0;i<m;i++)
{
cin>>pic[i];
}
cnt = 0;
memset(idx,0,sizeof(idx));
for (i=0;i<m;i++)
{
for (j=0;j<n;j++)
{
if(idx[i][j]==0 && pic[i][j] == '@')
{
cnt++;
dfs(i,j);
}
}
}
cout<<cnt<<endl;
}
return 0;
}原文地址:http://blog.csdn.net/xinwen1995/article/details/45542221