CodeForces - 330C Purification
题意:一个n阶矩阵,' . '代表这一股邪恶力量,'E'代表着多股的邪恶力量,在一个格子上施法,与这个格子同行同列的邪恶力量都会被消除,但是不能在‘E’上施法,即使这个E上的邪恶力量已经被消除,这个矩阵每个点都有邪恶力量,求把所有邪恶力量都消除的最小施法次数对应的施法位置,如果不能消灭所有的邪恶力量,则输出-1
思路:当有一个点所在列,所在行都是E时,那么这个点的邪恶力量肯定无法消除,输出-1。如果可以消除所有的邪恶力量,那么施法最小的次数肯定为n次,并且这n次在不同列或不同行,这样的话我们就遍历每一行或每一列,在每一行或每一列找出'.'点就行了
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
char map[101][101];
int r[101],c[101];
struct node{
int x,y;
node(){}
node(int tx,int ty){x=tx;y=ty;}
};
void print(queue<node> q){
while(!q.empty()){
struct node n1;
n1=q.front();
printf("%d %d\n",n1.x+1,n1.y+1);
q.pop();
}
}
int main(void){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%s",map[i]);
for(int j=0;j<n;j++){
if(map[i][j]=='E'){
r[i]++;
c[j]++;
}
}
}
queue<node> q1,q2;
int flag1=0,flag2=0;
for(int i=0;i<n;i++){
if(r[i]==n){
flag1=1;
break;
}
for(int j=0;j<n;j++){
if(map[i][j]=='.'){
q1.push(node(i,j));
break;
}
}
}
for(int i=0;i<n;i++){
if(c[i]==n){
flag2=1;
break;
}
for(int j=0;j<n;j++){
if(map[j][i]=='.'){
q2.push(node(j,i));
break;
}
}
}
if(flag1&&flag2){
printf("-1\n");
}else if(flag1){
print(q2);
}else if(flag2){
print(q1);
}else{
print(q1);
}
return 0;
}