题目描述
在遥远的南太平洋,有一片被古老传说笼罩的海域,名为"迷雾之渊"。这里常年被厚重的海雾笼罩,仿佛是大自然特意为这片海域披上了一层面纱,掩盖着它不为人知的秘密。然而,这平静的海面下,一场突如其来的危机正悄然酝酿。
故事的主角是 A 国的一艘先进驱逐舰——"守护者''号。它本是奉命执行例行巡逻任务,却意外接收到了来自 B 国边境海域的紧急求救信号。信号中充满了混乱与恐惧,似乎有不明军舰正在对 B 国的小型岛屿进行非法入侵。
这片海域可以看作 n×n 的一片网格图,通过 B 国传达的情报,敌方的不明军舰可以看作一个 1×5 或 5×1 的长方体,占据了海域中连续的 5 个网格(可能是连续的一行中 5 个网格,也可能是连续的一列中的 5 个网格),由于迷雾的影响,小哈尼并不清楚敌方不明军舰的具体位置,只知道其占据了 n×n 网格中的 5 个格子。经过排查,"守护者"号上一共有 2000 枚炮弹,每个炮弹可以击中一个网格,为了击退敌方军舰,小哈尼需要至少击中其占据的 5 个网格中的至少一个。现在作为"守护者"号舰长的小哈尼,需要构造一种导弹发射的方案,使得无论敌方军舰藏匿于哪个位置,都至少被一枚导弹击中。
输入格式
输入共一行,包含一个正整数 n
输出格式
输出一个 n×n 的网格,每个网格包含 . 和 # 两种字符中的一种,其中 . 表示不发射导弹, # 表示发射导弹,输出需要保证 # 的个数至多为 2000 个,且无论敌方军舰藏匿于哪个位置,都至少被一枚导弹击中,任意输出一种。
输入数据 1
8
输出数据 1
####....
....####
....####
####....
########
..#...#.
########
########
提示
样例解释
以上是一种合法的方案,其中任意一个 1×5 或 5×1 的矩形中都至少有一个导弹。
数据范围
对于 30% 的数据,1≤n≤40。对于 60% 的数据,1≤n≤70。对于所有测评数据,1≤n≤100。
请用c++解答

导弹(missile)
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- 一轮明月照丘壑 2024-09-28 08:15关注解决 无用评论 打赏 举报
- 梦幻精灵_cq 2024-09-28 10:08关注
我不懂C++,看着题目有趣,让我的ai学伴给出了C++代码和逻辑,我想用仅会的python基础代码搞一下。
您请自己求证ai的C++代码——
这个问题可以通过设计一种特定的导弹发射模式来解决,该模式确保无论敌舰如何放置,都能至少击中其占据的5个格子中的一个。由于要求#的个数至多为2000个,我们需要寻找一种高效的模式。一种可能的策略是创建一个棋盘样式的图案,这样每个1x5或5x1的区域至少会覆盖一个“#”。以下是C++代码示例,用于生成所需的nxn网格:
#include <iostream> #include <vector> #include <string> using namespace std; void printGrid(const vector<string>& grid) { for (const string& row : grid) { cout << row << endl; } } void placeMissiles(int n) { vector<string> grid(n, string(n, '.')); // 初始化网格,全部为'.' int count = 0; // 计数已发射的导弹数 // 棋盘样式填充 for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { // 只在棋盘格上放置导弹,且不超过2000枚 if ((i + j) % 2 == 0 && count < 2000) { grid[i][j] = '#'; count++; } } } printGrid(grid); } int main() { int n; cin >> n; placeMissiles(n); return 0; }
在这个例子中,我们创建了一个棋盘样式的网格,每个“#”占据的位置在行和列的索引之和为偶数的位置。这样的布局保证了无论1x5或5x1的矩形如何放置,都会至少覆盖一个“#”。
这个解决方案应该适用于所有测评数据,因为它保证了导弹的分布足够密集,同时导弹的总数不会超过2000个。当然,这个方案可能不是最优的,因为2000个“#”可能远未达到上限,但它是有效的。如果要优化导弹数量,可能需要更复杂的算法来确保覆盖的同时减少“#”的数量。
当我用python实现的时候,才发现ai对前面的代码描述是不对的。针对我的质疑ai修正了代码:
#include <iostream> #include <vector> #include <string> using namespace std; void show(const vector<string>& grid) { for (const string& row : grid) { cout << row << endl; } } void shootMap(int n, vector<string>& grid) { int count = 0; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { // 从第五行和第五列开始放置导弹,并且每隔一行和一列放置一个 if (i >= 4 && j >= 4 && (i - 4) % 5 == 0 && (j - 4) % 5 == 0) { grid[i][j] = '#'; count++; } } } cout << "消耗炮弹:" << count << endl; } int main() { int n; while (true) { cout << "请输入海域网格的大小 (n >= 5): "; cin >> n; if (n >= 5) { break; } cout << "海域网格大小必须大于等于5。" << endl; } vector<string> grid(n, string(n, '.')); // 创建一个n x n的网格 shootMap(n, grid); cout << "炮弹地图:" << endl; show(grid); return 0; }
我的python 代码
#!/sur/bin/nve python3 #coding: utf-8 def show(array): ''' 打印二维列表 ''' return '\n'.join([''.join(row) for row in array]) def sea_map(n): ''' 海域网格 ''' sea_map = [] for i in range(n): sea_map.append(list('.'*n)) return sea_map def shoot_map(n): ''' 炮击图 ''' shoot_map = sea_map(n) shoots = 0 for i in range(len(shoot_map)): for j in range(len(shoot_map[i])): if not (i+1)%5 or not (j+1)%5: shoots += 1 # 炮弹计数 shoot_map[i][j] = '#' # 标识炮击位 return shoots, shoot_map def main() -> None: while True: try: n = int(input('\nn = ')) break except ValueError as e: print(f"\nErrorType: {e}") shoots, shoots_map = shoot_map(n) print(f"\n\n{'':-^42}\n\n炮弹地图:\n{show(shoots_map)}\n\n消耗炮弹:{shoots}\n\n{'':-^42}") if __name__ == '__main__': main()
- 效果
这算是正解了吧!😋
python脚本
#!/sur/bin/nve python3 #coding: utf-8 def show(array): ''' 打印二维列表 ''' return '\n'.join([''.join(row) for row in array]) def sea_map(n): ''' 海域网格 ''' sea_map = [] for i in range(n): sea_map.append(list('.'*n)) return sea_map def shoot_map(n): ''' 炮击图 ''' shoot_map = sea_map(n) shoots = 0 for i in range(len(shoot_map)): for j in range(len(shoot_map[i])): if not ((i+1)%5 and (j+1)%5): shoots += 1 # 炮弹计数 shoot_map[i][j] = '#' # 标识炮击位 if not (i+1)%5 and not (j+1)%5: shoots -= 1 # 清除多放数 shoot_map[i][j] = '.' # 清除误放炮击位 return shoots, shoot_map def main() -> None: while True: try: n = int(input('\nn = ')) break except ValueError as e: print(f"\nErrorType: {e}") shoots, shoots_map = shoot_map(n) print(f"\n\n{'':-^42}\n\n炮弹地图:\n{show(shoots_map)}\n\n消耗炮弹:{shoots}\n\n{'':-^42}") if __name__ == '__main__': main()
这,算是正解了吧。😋
python脚本
#!/sur/bin/nve python3 #coding: utf-8 def show(array): ''' 打印二维列表 ''' return '\n'.join([''.join(row) for row in array]) def sea_map(n): ''' 海域网格 ''' sea_map = [] for i in range(n): sea_map.append(list('.'*n)) return sea_map def shoot_map(n): ''' 炮击图 ''' shoot_map = sea_map(n) shoots = 0 for i in range(len(shoot_map)): for j in range(len(shoot_map[i])): if not ((i+1)%5 and (j+1)%5): shoots += 1 # 炮弹计数 shoot_map[i][j] = '#' # 标识炮击位 if not (i+1)%5 and not (j+1)%5: shoots -= 1 # 清除多放数 shoot_map[i][j] = '.' # 清除误放炮击位 return shoots, shoot_map def main() -> None: while True: try: n = int(input('\nn = ')) break except ValueError as e: print(f"\nErrorType: {e}") shoots, shoots_map = shoot_map(n) print(f"\n\n{'':-^42}\n\n炮弹地图:\n{show(shoots_map)}\n\n消耗炮弹:{shoots}\n\n{'':-^42}") if __name__ == '__main__': main()
解决 无用评论 打赏 举报 编辑记录 - 效果