作者:majiemajiemajie | 来源:互联网 | 2023-12-14 09:18
本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。
题意:有油的地块和邻近八个方向的有油地块算作1片油田。
看到题之后又是正常懵逼。
用x,y的位置表示每个点的状态,然后如果符合条件就将地块标记为不符合条件的地块就好了。
然后在怎么找符合条件的地块卡了一下。(其实遍历就好)两个for循环一上去,符合条件就dfs 然后计数君++
#include
#include
#include
using namespace std;
int Move[8][2] = { {1,0},{-1,0},{0,1},{0,-1},{-1,-1},{-1,1},{1,1},{1,-1} };
char map[102][102];
int N, M;int cou;
bool in(int a, int b) {return a > 0 && a <&#61; M && b > 0 && b <&#61; N&&map[a][b]!&#61;&#39;*&#39;;
}//判断点在范围内
void dfs(int x,int y){for (int i &#61; 0; i <8; i&#43;&#43;) {int nex &#61; x&#43; Move[i][0], ney &#61; y &#43; Move[i][1];if (in(nex, ney)) {map[nex][ney] &#61; &#39;*&#39;;dfs(nex, ney);}}}
int main() {while (cin >> M>>N){if ( M &#61;&#61; 0 ) break;cou &#61; 0;for (int i &#61; 1; i <&#61; M; i&#43;&#43;) {for (int j &#61; 1; j <&#61;N; j&#43;&#43;) {cin >> map[i][j];}}for (int i &#61; 1; i <&#61; M; i&#43;&#43;) {for(int j&#61;1;j<&#61;N;j&#43;&#43;)if (map[i][j] &#61;&#61; &#39;&#64;&#39;) {map[i][j] &#61; &#39;*&#39;;dfs(i, j);cou&#43;&#43;;}}cout <