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...
原文地址:https://www.cnblogs.com/xxx0624/p/3203942.html