挖地雷动规

题目描述

      在一个地图上有N个地窖(N<=200),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径,并规定路径都是单向的,也不存在可以从一个地窖出发经过若干地窖后又回到原来地窖的路径。某人可以从任一处开始挖地雷,然后沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使他能挖到最多的地雷。

输入

第一行一个整数n表示有n个地窖

第二行有n个整数表示每个地窖的地雷数

以下有若干行,每行有两个数x,y表示x可以到y,保证x小于y。

最后一行有两个0,表示输入结束

输出

第一行输出挖地雷的顺序。

第二行为最多挖出的地雷数

样例输入 

6

5 10 20 5 4 5

1 2

1 4

2 4

3 4

4 5

4 6

5 6

0 0

样例输出 

3-4-5-6

34

代码

#include <bits/stdc++.h>

using namespace std;

int maxx,maxid,f[210],fa[210];

void myprint(int id)

{

    if(id==-1) return;

    myprint(fa[id]);

    if(id!=maxid) cout<<id<<"-";

    else cout<<id<<endl;

}

int main()

{

    int n,d[210],r[210][210],x,y;

    cin>>n;

    for(int i=1;i<=n;i++)

        cin>>d[i];     

    while(1)

    {

        cin>>x>>y;

        if(x==0&&y==0)  

            break;

        r[x][y]=1;  

    };

    for(int i=1;i<=n;i++)

    {

        f[i]=d[i];

        fa[i]=-1;

        for(int j=1;j<=i-1;j++)

        {

            if(r[j][i]==1)

            {

                if(f[i]<max(f[j]+d[i],f[i]))

                {   

                f[i]=f[j]+d[i];

                fa[i]=j;

                }

            }

        }   

    }

    for(int i=1;i<=n;i++)

    {

        if(maxx<=f[i])

        {

        maxx=f[i];

        maxid=i;

        }   

    }

    myprint(maxid);

    cout<<maxx;

    return 0;

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自动挖雷程序需要实现以下几个步骤: 1. 使用图像识别技术识别出雷区的布局; 2. 根据雷区的布局,计算出每个格子周围的雷数; 3. 根据计算出的雷数,推断出每个格子的状态(是否是雷、是否已经被翻开、是否可以被翻开等); 4. 根据推断出的格子状态,进行自动翻开操作,直到所有非雷格子都被翻开。 下面是一个简单的 C++ 实现: ```cpp #include <iostream> #include <cstring> using namespace std; const int MAXN = 105; char mine[MAXN][MAXN]; bool visited[MAXN][MAXN]; int n, m; void dfs(int x, int y) { visited[x][y] = true; if (mine[x][y] != '0') return; for (int dx = -1; dx <= 1; dx++) { for (int dy = -1; dy <= 1; dy++) { int nx = x + dx, ny = y + dy; if (nx >= 0 && nx < n && ny >= 0 && ny < m && !visited[nx][ny]) { dfs(nx, ny); } } } } int main() { cin >> n >> m; memset(mine, '.', sizeof(mine)); memset(visited, false, sizeof(visited)); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> mine[i][j]; } } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (mine[i][j] == '0' && !visited[i][j]) { dfs(i, j); } } } int cnt = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (mine[i][j] != '*' && visited[i][j]) { cnt++; } } } cout << cnt << endl; return 0; } ``` 这个程序使用深度优先搜索来实现自动翻开操作,其中 `mine` 数组用来存储雷区的布局,`visited` 数组用来记录哪些格子已经被翻开。程序首先读入雷区的布局,然后对于每个未翻开的格子,使用深度优先搜索来翻开它周围的格子,直到无法再翻开为止。最后统计一下被翻开的格子数量即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值