CodeForces

来源:互联网 发布:php 获取共享文件 编辑:程序博客网 时间:2024/06/07 00:32

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;} 




原创粉丝点击