列表

详情


NC204415. 膜法记录

描述

牛牛最近在玩一款叫做《膜法记录》的游戏,这个游戏的机制是这样的:
在一局游戏中,所有的敌人都排布在一个  行  列的网格中,牛牛指挥着他的魔法少女对敌人进行攻击。
攻击有两种类型:行blast,列blast
行blast能消灭一整行的敌人,列blast能消灭一整列的敌人
牛牛总共能够释放  次行blast, 次列blast
给定某局游戏的初始局面,请问牛牛能否将敌人全歼?

输入描述

第一行包含一个正整数,表示测试数据组数,接下来是组测试数据
每组测试数据的第一行有四个正整数 ,,,
接下来有行,每行是一个长度为的字符串,第行第列的字符如果是*则说明这里有一个敌人,如果是.说明这里没有

输出描述

对每组测试数据输出一行,如果能消灭所有的敌人,就输出yes,否则输出no

示例1

输入:

2
3 3 1 2
..*
.*.
*..
4 4 3 1
..**
**..
.**.
*.**

输出:

yes
no

说明:

第一个样例,我可以在第一行放一个行blast,然后前两列都放一个列blast,就把敌人给全歼了。第二个样例,我不管怎么安排攻击策略,都没法全歼敌人

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 14ms, 内存消耗: 480K, 提交时间: 2020-03-21 22:27:38

#include<bits/stdc++.h>
using namespace std;
char s[21][100007];
int main(){
	int t;scanf("%d",&t);
	while(t--){
		int n,m,a,b;scanf("%d %d %d %d",&n,&m,&a,&b);
		for(int i=0;i<n;i++) scanf("%s",s[i]);
		bool f=0;
		for(int i=0;i<(1<<n);i++){
			int c=0,p=0;
			for(int j=0;j<n;j++) if((i>>j)&1) c++;
			if(c!=a) continue;
			for(int j=0;j<m;j++){
				bool z=0;
				for(int k=0;k<n;k++) if(!((i>>k)&1)&&s[k][j]=='*') {z=1;break;}
				if(z) p++;
			}
			if(p<=b) {f=1;break;}
		}
		puts(f?"yes":"no");
	}
    return 0;
}

C++ 解法, 执行用时: 8ms, 内存消耗: 416K, 提交时间: 2022-01-03 02:00:19

#include<bits/stdc++.h>
#define f(i,t) for(int i=0;i<(t);i++)
using namespace std;
char s[21][100001];
int main(){
    cin.tie(0),cout.tie(0),ios_base::sync_with_stdio(0);
	int t;cin>>t;
	while(t--){
		int n,m,a,b,f=0;cin>>n>>m>>a>>b;
		f(i,n)cin>>s[i];
		f(i,1<<n){
			int c=0,p=0;
			f(j,n)if((i>>j)&1)c++;
			if(c!=a)continue;
			f(j,m){
				int z=0;
				f(k,n)if(!((i>>k)&1)&&s[k][j]=='*'){z=1;break;}
				if(z)p++;
			}
			if(p<=b){f=1;break;}
		}puts(f?"yes":"no");
	}
}

上一题