合肥工业大学OJ1152

喵喵突袭Rua! 2019-06-25 02:18:29
Description
为了攻占东吴,曹操与周瑜在赤壁展开激烈的战斗。曹操的M*N艘船(1<=M<=200,1<=N<=500),在长江上排成一个M行N列的矩阵。曹操命人把相邻两艘船连接在一起。周瑜顺东风火烧赤壁,并派出一支部队活捉曹操。当然,曹操已经逃到岸上了。要抓住曹操就必须穿过这庞大的船队,才能及时登岸。然而,火势太大,部队每经过一条船就要受到一定的损伤。
给定每条船的火势强度(即伤害),求一条路径使部队受到的伤害最小。
Input
第1行 M N
以下M行 每行N个数,表示每条船的伤害。
部队可以登上第一行任意一条船,然后沿着船阵走到第M行的船,然后登岸。
Output
输出最小伤害值
Sample Input
3 4
10 10 1 10
2 2 2 10
1 10 10 10
Sample Output
8 代码: #include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int cul(vector<int> range, vector<vector<int>> v)
{
int sum = 0;
for (int i = 0; i < range.size() - 1; i++)
{
sum = sum + v[i][range[i]];
if (range[i] < range[i + 1])
for (int j = range[i] + 1; j <= range[i + 1]; j++)
sum = sum + v[i][j];
else if (range[i] > range[i + 1])
for (int j = range[i] - 1; j >= range[i + 1]; j--)
sum = sum + v[i][j];
else
{}
}
sum = sum + v[range.size() - 1][range[range.size() - 1]];
return sum;
}

int main()
{
int sum = 9999;
int n, m;
cin >> m >> n;
vector<vector<int>> v(m,vector<int>(n));
vector<int> range(m);
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
{
int damage;
cin >> damage;
v[i][j] = damage;
}
for (int i = 0; i < range.size(); i++)
range[i] = 0;
bool p = true;
while (p)
{
p = false;
for (int i = 0; i < range.size(); i++)
if (range[i] != n - 1)
p = true;
sum = min(sum, cul(range, v));
range[0]++;
for (int i = 0; i < range.size(); i++)
{
if (range[i] > n - 1 && p)
{
range[i] = 0;
range[i + 1]++;
}
}
}
cout << sum << endl;
}
...全文
101 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Italink 2019-06-25
  • 打赏
  • 举报
回复

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n, m;
vector<vector<int>> mp;
int dirt[3][2] = { {1,0},{0,-1},{0,1} };
int bfs(int x,int y) {
if (x == m - 1)
return abs(mp[x][y]);
int min = 0;
for (int k = 0; k < 3; k++) {
int i = x + dirt[k][0],
j = y + dirt[k][1];
if (j >= 0 && j < n && mp[i][j]>0 ) {
mp[i][j] *= -1;
int k = bfs(i, j);
if (min == 0 || k < min)
min = k;
mp[i][j] *= -1;
}
}
return abs(mp[x][y]) + min;
}
int main(){
cin >> m >> n;
mp.resize(m, vector(n, 0));
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
cin >> mp[i][j];
int min = 0, k;
for (int i = 0; i < n; i++) {
mp[0][i] *= -1; //标记访问
k = bfs(0, i);
mp[0][i] *= -1;
if (min==0||k < min)
min = k;
}
cout << min;
return 0;
}

android2008 2019-06-25
  • 打赏
  • 举报
回复
有个想法:
用一个MXN的数组做flag表示是否已经设置好最终值,初始化为0
先把第一行的N个节点(m,n,alue)以value为健值建一个最小堆,把第一行的flag设置为1
从堆中取最小的值的节点,对上下左右4个位置,如果flag为0则计算该节点的值,设置flag并把节点加入堆中,循环一直到有节点是最后一行时,计算的值就是所求的最小值。
android2008 2019-06-25
  • 打赏
  • 举报
回复
这排版谁能看清啊

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧