CF传送门
题意:
1. 一张地图(二维数组建立的图)上存在墙(*)和空地(.)
2. 给你一颗炸弹,要求放在地图上的某一点可以炸毁所有墙,炸弹可以无视距离炸毁上下左右四个方向所有东西
3. 如果可以炸毁所有墙就输出YES并输出炸弹放置点,否则直接输出NO
题解:
1. 我原本是遍历整张图来计算,然后妥妥的超时
2. 打表,把每一行上的墙数量存到一个数组,再把每一列上的墙数量存到另一个数组
3. 遍历地图,把两个数组相加,再判断炸弹所在点的情况即可
4. 如果炸弹放置点是墙,则对应行列相加后要减1,否则不变
以下是我的AC代码:
//十字炸弹,按行列打表 #include <cstdio> #include <cstring> #define maxn 1005 using namespace std; char s[maxn][maxn]; //存储地图 int r[maxn],l[maxn]; //存储行列炸弹数量 int main() { memset(r,0,sizeof(r)); memset(l,0,sizeof(l)); int n,m,sum=0; scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) { getchar(); for(int j=1;j<=m;j++) { scanf("%c",&s[i][j]); if(s[i][j]=='*') { sum++; //计算总墙数量 r[i]++; //对应行墙数量+1 l[j]++; //对应列墙数量+1 } } } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { int flag=r[i]+l[j]; if(s[i][j]=='*') //如果炸弹放置点是墙就墙数量减1 flag--; if(flag==sum) //如果刚好炸毁所有墙,就打印结果并结束程序 { printf("YES\n%d %d\n",i,j); return 0; } } } printf("NO\n"); return 0; }