题目链接——
首先给出一个n*m的字符矩阵,‘*’表示空地,‘@’表示油井。问在这个矩阵中有多少组油井区?
每个点周围的8个点都可以与之相连。
从左上角的点开始向后枚举然后dfs搜索就可以了。记得记忆化。
废话说完,上代码——
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 7 const int N = 210; 8 const int M = 8; 9 10 int dis[M][2] = { {-1, -1}, {-1, 0}, {-1, 1}, { 0, -1}, { 0, 1}, { 1, -1}, { 1, 0}, { 1, 1}}; //判断8个方向11 char mp[N][N]; //原图12 int n, m; //矩阵大小13 int ans; //结果14 15 void dfs(int x, int y) //dfs搜索函数16 {17 mp[x][y] = '*'; //当前点初处理后需要将它消掉,免得重复处理,即“记忆化”18 for(int i = 0; i < M; i++)19 {20 int mx = x+dis[i][0];21 int my = y+dis[i][1];22 if(mx >= 0 && mx < n && my >= 0 && my < m && mp[mx][my] == '@') dfs(mx, my);23 }24 }25 26 void Work() //主处理函数27 {28 for(int i = 0; i < n; i++)29 {30 for(int j = 0; j < m; j++)31 {32 if(mp[i][j] == '@')33 {34 ans++;35 dfs(i, j);36 }37 }38 }39 }40 41 void Init() //初始化函数42 {43 getchar();44 for(int i = 0; i < n; i++) scanf("%s", mp[i]);45 ans = 0;46 }47 48 void Outit() //输出函数49 {50 printf("%d\n", ans);51 }52 53 int main()54 {55 //freopen("test.in", "r", stdin);56 while(~scanf("%d%d", &n, &m) && m)57 {58 Init();59 Work();60 Outit();61 }62 return 0;63 }