挖地雷
2013-11-11 11:08
169 查看
挖地雷
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)Total Submission(s) : 18 Accepted Submission(s) : 9
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
在一个地图上有n个地窖(n<=200),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径,并规定路径都是单向的,也不存在可以从一个地窖出发经过若干地窖后又回到原来地窖的路径。某人可以从任一处开始挖地雷,然后沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使他能挖到最多的地雷。(用动态规划求解)Input
输入有多组数据,每组数据的第一行为一个整数n,表示地窖的个数,第二行为n个地窖中的地雷数。下面多行数据以0,0结束,每行为两个数x和y,表示从x可以到y。Output
对于每组数据输出两行,第一行为挖地雷的顺序,第二行为最多挖出的地雷数Sample Input
1 6 5 10 20 5 4 5 1 2 1 4 2 4 3 4 4 5 4 6 5 6 0 0
Sample Output
3-4-5-6 34
#include <iostream>
#include <string.h>
#include <stack>
#include <stdio.h>
using namespace std;
int main ()
{ int a[220];//储存地雷个数
int b[220];// 储存路径
int d[220][220]; //存储可以相通的路径
int t,n;
stack <int > s;
int i,j,x,y;
int cmax,h;
int max1,flag;
cin>>t;
while(t--)
{ memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(d,0,sizeof(d));
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
do
{
cin>>x>>y;
d[x][y]=1;
}
while((x!=0)&&(y!=0));
for(i=2;i<=n;i++)
{
cmax=a[i];
for(j=1;j<i;j++)
if(d[j][i]==1&&a[i]<a[j]+cmax) //例如i=3 j 从1到3 就搜索1是否可以到达2 3;
{
a[i]=a[j]+cmax;
b[i]=j;
}
}
max1=0;
for(i=1;i<=n;i++)
{
if(a[i]>max1)
{
max1=a[i];
flag=i;
}
}
do
{
s.push(flag);
flag=b[flag];
}while(flag);
// h=s.top();
cout<<s.top();
s.pop();
while(!s.empty())
{
cout<<'-'<<s.top();
s.pop();
}
cout<<endl;
cout<<max1<<endl;
}
return 0;
}
相关文章推荐
- 踩到地雷了
- c++地雷(待续)
- ACM-Giroro的地雷测试(AC,广度优先搜索)
- 中移动又埋下了一颗地雷?
- PyQt挖地雷游戏学习笔记(5)
- noip1996 挖地雷 - 提高组 (搜索)
- hrbust 哈理工 统计地雷数量
- 挖地雷问题 单向 动态规划
- luoguP2196 挖地雷 题解
- [Java] Java踩地雷产生程式
- 扫雷程序-地雷位置生成(类库版)
- csuoj 1355: 地雷清除计划
- PyQt挖地雷游戏学习笔记(6)
- HMTL-扫雷3--地雷位置随机
- 1996年分区联赛提高组之三 挖地雷
- 挖地雷问题 dfs
- 14:扫雷游戏地雷数计算
- C语言初学者易踩十八颗“地雷”
- C语言初学者的十八颗“地雷”