题目描述
为了庆祝自己的生日,小张推出一款游戏。游戏在一个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; }