CF192div2-C - Purification
题意:
从给定的图中找出某些点,这些点能够消除同一行和同一列的“怪物”。求使得最少的点的位置。
关键:要想消除整张的图的妖怪,必须选中n个点(对于n行n列来说)!!!!!!!!!!!
做法:对于每一行来说都要被消去,则每一行都至少要有一个 ‘ . ’;另外就是如果这种方法不行,则看每一列。
如果每一列都有一个 ' . ',同样也是可行的。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 #include<string.h> 3 4 const int maxn = 105; 5 char mat[ maxn ][ maxn ]; 6 bool vis[ maxn ][ maxn ]; 7 struct node{ 8 int x,y; 9 }ans[ maxn<<2 ]; 10 11 bool judge( int n ){ 12 for( int i=1;i<=n;i++ ){ 13 for( int j=1;j<=n;j++ ){ 14 if( vis[i][j]==false ) 15 return false; 16 } 17 } 18 return true; 19 } 20 21 int main(){ 22 int n; 23 while( scanf("%d",&n)==1 ){ 24 for( int i=1;i<=n;i++ ){ 25 scanf("%s",mat[i]+1); 26 } 27 memset( vis,false,sizeof( vis ) ); 28 int cnt = 0; 29 for( int i=1;i<=n;i++ ){ 30 int fy = -1; 31 for( int j=1;j<=n;j++ ){ 32 if( mat[i][j]=='.' ){ 33 fy = j; 34 break; 35 } 36 } 37 if( fy==-1 ) 38 continue; 39 for( int k=1;k<=n;k++ ){ 40 vis[ i ][ k ] = true; 41 vis[ k ][ fy ] = true; 42 } 43 ans[cnt].x = i; 44 ans[cnt].y = fy; 45 cnt++; 46 }//each row need one '.' 47 /*if( cnt==inf ){ 48 printf("-1\n"); 49 continue; 50 }*/ 51 if( judge(n)==true ){ 52 for( int i=0;i<cnt;i++ ) 53 printf("%d %d\n",ans[i].x,ans[i].y); 54 continue; 55 } 56 cnt = 0; 57 memset( vis,false,sizeof( vis ) ); 58 for( int i=1;i<=n;i++ ){ 59 int fx = -1; 60 for( int j=1;j<=n;j++ ){ 61 if( mat[j][i]=='.' ){ 62 fx = j; 63 break; 64 } 65 } 66 if( fx==-1 ) 67 continue; 68 for( int k=1;k<=n;k++ ){ 69 vis[k][i] = true; 70 vis[fx][k] = true; 71 } 72 ans[cnt].x = fx; 73 ans[cnt].y = i; 74 cnt++; 75 } 76 if( judge(n)==true ){ 77 for( int i=0;i<cnt;i++ ) 78 printf("%d %d\n",ans[i].x,ans[i].y); 79 continue; 80 } 81 printf("-1\n"); 82 } 83 return 0; 84 }
keep moving...