青橙OJ A1105. 挖地雷

问题描述
  在一个地图上有N个地窖(N<=12),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径。

  [题目要求]
  当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷,每个地窖只能经过一次,然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使某人能挖到最多的地雷。
输入格式
  第一行一个数n。
  第二行n个数wi表示每个点的地雷数。
  随后n-1行若干个数。第i行第j个数表示i与i+j是否连通。1为连通,0为不连通。
输出格式
  K 1--K 2--……….K (挖地雷的顺序)
  MAX=ans (挖地雷的数量)
  如果有多种方案则输出字典序最小的方案。
样例输入
5
10 8 4 7 6
1 1 1 1
0 0 0
1 1
1
样例输出
2-1-3-4-5
MAX=35
数据规模和约定
  n<=12

题解

dfs就好。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int n,v[15],map[15][15];
int f[15],pd[15],frm[15],ans,last;
void init()
{
	scanf("%d",&n);
	int i,j,x;
	for(i=1;i<=n;i++) scanf("%d",&v[i]);
	for(i=1;i<=n;i++)
	for(j=1;j<=n-i;j++)
	   {scanf("%d",&map[i][i+j]);
	    map[i+j][i]=map[i][i+j];
	   }
}
void dfs(int x,int s)
{
	int i,tag=0;
	s=s+v[x]; pd[x]=1;
	for(i=1;i<=n;i++)
	   {if(map[x][i]&&!pd[i])
	       {f[i]=x; dfs(i,s); tag=1;
		    f[i]=0;
		   }
	   }
	if(tag==0)
	   {if(s>ans)
	       {ans=s; last=x;
		    for(i=1;i<=n;i++) frm[i]=f[i];
		   }
	   }
	pd[x]=0;
}
void PRINT(int x)
{
	if(x==0) return;
	PRINT(frm[x]);
	if(x!=last) printf("%d-",x);
	else printf("%d\n",x);
}
int main()
{
	init();
	int i;
	for(i=1;i<=n;i++)
	   {memset(pd,0,sizeof(pd));
	    memset(f,0,sizeof(f));
	    dfs(i,0);
	   }
	PRINT(last);
	printf("MAX=%d\n",ans);
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值