題意:相當於求圖中連通子圖的個數,這裡的連通按照題意要求為 八鄰域連通(上,下,左,右,四個對角)
思路:深度優先,依次搜索圖中每個點的八鄰域,並注意標記訪問,不然後果很嚴重.
AC 代碼:46MS 416K 速度不慢,可能對於圖中障礙比較多的緣故。
[cpp]
#include <iostream>
#include <string>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#include <sstream>
#include <cstdlib>
#include <fstream>
#include <queue>
using namespace std;
bool visit[110][110]; //重復訪問控制
char maze[110][110]; //地圖
int dir[8][2]={{-1,0},{1,0},{0,1},{0,-1},{-1,-1},{-1,1},{1,-1},{1,1}};//八個方向
int sum,m,n,sx,sy;
bool isbound(int a,int b){ //判斷邊界
if(a<1 || a>m || b<1 || b>n)return true;
return false;
}
void dfs(int sx,int sy){ //對每一個點進行深搜
for(int i=0;i<8;i++)
{
if(maze[sx+dir[i][0]][sy+dir[i][1]]=='*')continue;//障礙返回
if(isbound(sx+dir[i][0],sy+dir[i][1]))continue;//邊界返回
if(visit[sx+dir[i][0]][sy+dir[i][1]])continue;//已訪問,返回
visit[sx+dir[i][0]][sy+dir[i][1]]=1; //標記已訪問,防止重復訪問
dfs(sx+dir[i][0],sy+dir[i][1]);
}
}
int main()
{
while(cin>>m>>n)
{
if(m==0)break;
memset(visit,0,sizeof(visit));
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>maze[i][j];
}
}
sum=0;
for(int i=1;i<=m;i++){ //對每一個點進行深搜的條件是:
//1:不是障礙,2:沒有被訪問過
for(int j=1;j<=n;j++){
if(maze[i][j]=='@'&& !visit[i][j]){visit[i][j]=1; dfs(i,j);sum++;}
}
}
cout<<sum<<endl;
}
return 0;
}
#include <iostream>
#include <string>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#include <sstream>
#include <cstdlib>
#include <fstream>
#include <queue>
using namespace std;
bool visit[110][110]; //重復訪問控制
char maze[110][110]; //地圖
int dir[8][2]={{-1,0},{1,0},{0,1},{0,-1},{-1,-1},{-1,1},{1,-1},{1,1}};//八個方向
int sum,m,n,sx,sy;
bool isbound(int a,int b){ //判斷邊界
if(a<1 || a>m || b<1 || b>n)return true;
return false;
}
void dfs(int sx,int sy){ //對每一個點進行深搜
for(int i=0;i<8;i++)
{
if(maze[sx+dir[i][0]][sy+dir[i][1]]=='*')continue;//障礙返回
if(isbound(sx+dir[i][0],sy+dir[i][1]))continue;//邊界返回
if(visit[sx+dir[i][0]][sy+dir[i][1]])continue;//已訪問,返回
visit[sx+dir[i][0]][sy+dir[i][1]]=1; //標記已訪問,防止重復訪問
dfs(sx+dir[i][0],sy+dir[i][1]);
}
}
int main()
{
while(cin>>m>>n)
{
if(m==0)break;
memset(visit,0,sizeof(visit));
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>maze[i][j];
}
}
sum=0;
for(int i=1;i<=m;i++){ //對每一個點進行深搜的條件是:
//1:不是障礙,2:沒有被訪問過
for(int j=1;j<=n;j++){
if(maze[i][j]=='@'&& !visit[i][j]){visit[i][j]=1; dfs(i,j);sum++;}
}
}
cout<<sum<<endl;
}
return 0;
}