您的位置:首页 > 其它

搜索专题 M

2017-05-12 23:00 225 查看
1、简单描述

一个m*n的方阵,由*和@组成,计算共有多少个@块。

2、思路

#include<iostream>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
int m,n;
char mp[101][101];
int dir[8][2]={{-1,0},{1,0},{0,1},{0,-1},{-1,-1},{-1,1},{1,-1},{1,1}};
struct node
{
int x,y;
node(){};
node(int a,int b){x=a;y=b;}
};
bool vis[101][101];
bool check(int i,int j)
{
if(i<1||i>m||j<1||j>n)
return false;
if(mp[i][j]=='*')
return false;
if(vis[i][j])
return false;
return true;
}
void bfs(int i,int j)
{
vis[i][j]=true;
node now(i,j);
queue<node>q;
q.push(now);
while(!q.empty())
{
node next=q.front();
q.pop();
vis[next.x][next.y]=true;
int nx,ny;
for(int i=0;i<8;i++)
{
nx=next.x+dir[i][0];
ny=next.y+dir[i][1];
if(check(nx,ny))
{
node tmp(nx,ny);
q.push(tmp);
}
}
}
}

int main()
{
while(cin>>m>>n)
{
if(m+n==0)break;
memset(vis,0,sizeof(vis));
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
cin>>mp[i][j];
int cnt=0;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
if(mp[i][j]=='@'&&!vis[i][j])
{
bfs(i,j);
cnt++;
}
}
cout<<cnt<<endl;
}
return 0;
}

一开始想用bfs,结果超时了,本来以为数据量不是很大,不会出问题的,结果。。。。换用dfs。


#include<iostream>
#include<string.h>
using namespace std;
int m,n;
bool vis[101][101];
char mp[101][101];
int dir[8][2]={{-1,0},{1,0},{0,1},{0,-1},{-1,-1},{-1,1},{1,-1},{1,1}};
bool island(int i,int j)
{
if(i<1||i>m||j<1||j>n)  return false;
return true;
}
void dfs(int x,int y)
{
for(int i=0;i<8;i++)
{
if(!island(x+dir[i][0],y+dir[i][1])) continue;
if(vis[x+dir[i][0]][y+dir[i][1]]) continue;
if(mp[x+dir[i][0]][y+dir[i][1]]=='*')continue;
vis[x+dir[i][0]][y+dir[i][1]]=true;
dfs(x+dir[i][0],y+dir[i][1]);
}

}
int main()
{
while(cin>>m>>n)
{
memset(vis,0,sizeof(vis));
int sum=0;
if(m+n==0)break;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
cin>>mp[i][j];//cout<<"1"<<endl;
}
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
if(mp[i][j]=='@'&&!vis[i][j])
{
vis[i][j]=true;
dfs(i,j);
sum++;
}
}
cout<<sum<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: