zoukankan      html  css  js  c++  java
  • CF192div2-C

    题意:

    从给定的图中找出某些点,这些点能够消除同一行和同一列的“怪物”。求使得最少的点的位置。

    关键:要想消除整张的图的妖怪,必须选中n个点(对于n行n列来说)!!!!!!!!!!!

    做法:对于每一行来说都要被消去,则每一行都至少要有一个 ‘ . ’;另外就是如果这种方法不行,则看每一列。

    如果每一列都有一个 ' . ',同样也是可行的。

     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
    ");
    49             continue;
    50         }*/
    51         if( judge(n)==true ){
    52             for( int i=0;i<cnt;i++ )
    53                 printf("%d %d
    ",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
    ",ans[i].x,ans[i].y);
    79             continue;
    80         }
    81         printf("-1
    ");
    82     }
    83     return 0;
    84 }
    View Code
    keep moving...
  • 相关阅读:
    插入排序
    2019何凯文五夜十篇
    文件
    结构体数组表示
    位运算应用
    条件编译 预处理命令
    文件包含
    带参宏定义
    宏定义有无参数宏定义和带参数宏定义两种
    phpcms v9网站搬家更换域名的方法
  • 原文地址:https://www.cnblogs.com/xxx0624/p/3203942.html
Copyright © 2011-2022 走看看