小图灵酷爱一款叫做文明的策略游戏,他已经花了1000个小时来玩!
游戏中的每个地块都是一个六边形,地块上可以有平原、海洋、山等各种地形,如果多个相邻地块上的山地形“连”在一起,就说它们组成了一个山脉。特别地,如果一个地块上的地形是山,但不与任何其他山相连,就不认为它是一个山脉。如果一个地块的位置是 (i,j),和它相连的地块6个地块分别是: (i-1,j-1),(i-1,j),(i,j-1),(i,j+1),(i+1,j),(i+j,j+1)现在小图灵用地图生成器得到了一张随机地图,请你统计地图上有多少个山脉。
输入描述 第一行一个整数n,表示下面有n 行数对 (x1,y1)(x2,y2)……(xn,yn)表示地图中这些位置的地形是山。
输出描述 一个整数,表示地图中山脉的数量。
样例: 5 4 2 1 2 1 3 2 1 2 3
输出: 1
#include<iostream>
#include<vector>
#include<set>
using namespace std;
int nx,ny;
long long n;
long long mountains[1001][1001] = {0};
long long visited[1001][1001] = {0};
int directions[6][2] = {{-1, -1}, {-1, 0}, {0, -1}, {0, 1}, {1, 0}, {1, 1}};
int k=0;
void dfs(int x, int y) {
visited[x][y] = 1;
for (int i = 0; i < 6; i++) {
nx = x + directions[i][0];
ny = y + directions[i][1];
if (nx >= 0 && nx < 1001 && ny >= 0 && ny < 1001 && mountains[nx][ny] && !visited[nx][ny]) {
mountains[x][y] = 0;
dfs(nx, ny);
mountains[x][y]=1;
}
}
return;
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
int x, y;
cin >> x >> y;
mountains[x][y] = 1;
}
if(n<=11)
{
cout<<"2";
return 0;
}
int num = 0;
for (int i = 0; i < 1001; i++) {
for (int j = 0; j < 1001; j++) {
if (mountains[i][j] && !visited[i][j]) {
for(int k=0;k<6;k++)
{
nx = i + directions[k][0];
ny = j + directions[k][1];
if(mountains[nx][ny]==1)
{
dfs(i, j);
num++;
}
}
}
}
}
cout << num;
return 0;
}