CF699B One Bomb


题目传送门

思路:

大模拟,枚举每一个格子是否可以炸掉所有墙面就好了。

$n$ 和 $m$ 范围非常小,所以暴力完全可以过。

AC代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){//快读优化。
  	int x=0,f=1;
  	char c=getchar();
  	for(;c<'0'||c>'9';c=getchar())
    	if(c=='-')f=-1;
  	for(;c<='9'&&c>='0';c=getchar())
    	x=(x<<3)+(x<<1)+c-'0';
  	return x*f;
}
int n,m,ans=0;//ans存储地图中的墙面数。
char c[1005][1005];//地图。 
int h[1005]={0},l[1005]={0};//h[i]代表第i行有多少个墙,l[j]代表第j行有多少个墙。
signed main(){
	n=read(),m=read();//输入。
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			c[i][j]=getchar();//输入。 
			if(c[i][j]=='*')h[i]++,l[j]++,ans++;//当前位置为墙面时,则行、列、总数组的值均加一。
		}
		getchar();//注意换行符。
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			int sum=h[i]+l[j];//定义sum为当前位置可以炸到的所有墙面。
			if(c[i][j]=='*')sum--;//可以想想为什么要特判(思考题)
			if(sum==ans){//如果当前可以炸掉的墙面与地图中的墙面数相同。 
				cout<<"YES"<<endl<<i<<" "<<j<<endl;//输出炸弹坐标。
				return 0;//结束程序。 
			}
		}
	}
	cout<<"NO"<<endl;//炸不完 。
	return 0;//结束程序。 
}

思考题答案:

因为当前为如果是墙面的话,当前行和列都有将这个墙面算进去,所以要去重(总量 $-1$ )。


文章作者: alex_liu
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 alex_liu !
  目录