站外题目求调
查看原帖
站外题目求调
766781
genshin202729852楼主2024/8/6 20:19

小图灵酷爱一款叫做文明的策略游戏,他已经花了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;
}
2024/8/6 20:19
加载中...