杀怪物

题目描述

为了庆祝自己的生日,小张推出一款游戏。游戏在一个20×20的方格上进行,上面有一些怪物,用“#”表示,其他是空格,用“.”表示。怪物有两点体力。体力为0时死亡。

你可以进行以下操作:

(1)使一个横行上的怪物体力减一

(2)使一个竖行上的怪物体力减一

对每个横行或竖行只能操作一次,限定n次,问最多能杀死多少个怪物。

输入输出格式

输入格式:

第一行为整数n(1≤n≤40),表示操作的次数。

接下来是一个20×20的方格,“#”表示怪物,“.”表示空格。

输出格式:

一行,输出最多能杀死的怪物数量。

输入输出样例

输入样例一:
3 
.................... 
.................... 
..###............... 
.................... 
.................... 
.................... 
.................... 
.................... 
.................... 
.................... 
.................... 
.................... 
.................... 
.................... 
.................... 
.................... 
.................... 
.................... 
.................... 
.................... 
输出样例一:
2
输入样例二:
10 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
输出样例二:
25
思路:搜索行,寻找能杀死最多怪物的列。
//程序名:新的C++程序
//作者: 

#include<iostream>
#include<fstream>
#include<algorithm>

using namespace std;
int m,a[25][25],c[25],ans;
char cc;
void dfs(int x,int y)
{
    if(y>=m)return;
    int t[25]={0},t1=0,t2=m-y;
    for(int i=1;i<=20;i++)t[c[i]]++;
    for(int i=20;i>0;i--)
    {
        if(t==0)break;
        if(t[i]<=t2)t1+=t[i]*i,t2-=t[i];
        else t1+=t2*i,t2=0;
    }
    ans=max(ans,t1);
    for(int i=x;i<=20;i++)
    {
        for(int j=1;j<=20;++j)if(a[i][j])++c[j];
        dfs(i+1,y+1);
        for(int j=1;j<=20;++j)if(a[i][j])--c[j];
    }
    return;
}

int main()
{
    cin >> m;
    for(int i=1;i<=20;i++)
        for(int j=1;j<=20;j++){cin>>cc;if(cc=='#')a[i][j]=1;}
    dfs(1,0);
    cout<<ans;
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/2006hanziwei/p/10756101.html
今日推荐