http://acm.hdu.edu.cn/showproblem.php?pid=1241
题意:求连通分量的个数,8个方向。
做过好几次了,表示对dfs,bfs真没感觉。嗨。哭死。。。
View Code
// I'm lanjiangzhou //C #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <math.h> #include <time.h> //C++ #include <iostream> #include <algorithm> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <cctype> #include <stack> #include <string> #include <list> #include <queue> #include <map> #include <vector> #include <deque> #include <set> using namespace std; //*************************OUTPUT************************* #ifdef WIN32 #define INT64 "%I64d" #define UINT64 "%I64u" #else #define INT64 "%lld" #define UINT64 "%llu" #endif //**************************CONSTANT*********************** #define INF 0x3f3f3f3f // aply for the memory of the stack //#pragma comment (linker, "/STACK:1024000000,1024000000") //end const int maxn =1010; int n,m; int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}}; int dis[maxn][maxn]; char maps[maxn][maxn]; int sum; int vis[maxn][maxn]; void dfs(int start,int end){ //vis[start][end]=1; //int x=start+dir[] maps[start][end]='*'; for(int i=0;i<8;i++){ int x=dir[i][0]+start; int y=dir[i][1]+end; if(x<0||x>=n||y<0||y>=m) continue; if(maps[x][y]=='@'){ dfs(x,y); } } } int main(){ while(scanf("%d%d",&n,&m)!=EOF){ if(n==0&&m==0) break; // memset(vis,0,sizeof(vis)); getchar(); for(int i=0;i<n;i++){ scanf("%s",maps[i]); //for(int j=0;j<m;j++){ // if(maps[i][j]=='@'){ // dis[i][j]=1; //} //else dis[i][j]=0; // } } sum=0; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(maps[i][j]=='@'){ dfs(i,j); sum++; } } } printf("%d\n",sum); } return 0; }