据说这是水题~~三点二十做到四点四十水了三个题,后面的题目真长!
A。Cakeministor
一个N*M的蛋糕,里面有几个毒草莓,现在这个人一下可以吃一行或者一列,但是不能吃到毒草莓,问最多可以吃掉多少格子的蛋糕。
只要算出有多少行和列是没有毒草莓的,若分别为A,B,那么答案就是A*M+B*N-A*B。
B。Road Construction
有N个城市,彼此之间都没有道路,现在要求每两个城市之间最多只能有两条边,然后给定一些城市对之间不能直接连边,输出修路的方案。
以为不能直接连边的城市对小于城市数的二分之一,所以一定会有某一个城市和其他任意城市都能连边。那么只要把其他城市和他连起来就可以了。
C。Purification
一个N*N的矩阵,由‘ E ’和‘ . ’组成,每次贴一张符,可以净化掉同一行和同一列的格子,但是符只能贴在‘ . ’上,问符要贴在哪里~~
显然要贴N张符,即,每一行都有一个点或者每一列都有一个点~~否则就输出-1.所以只要判断是何种情况然后每一行或者每一列输出一个点就可以了~~
本来想用dfs写的,想想直接做就好叻~~
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
struct node
{
int x,y;
}row[10010],col[10010];
int n,lbr[110],lbc[110];
char map[110][110];
int main()
{
int i,j,k,cntr=0,cntc=0,flag=1,cnt;
scanf("%d",&n);
for (i=0;i<n;i++)
scanf("%s",map[i]);
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
if (map[i][j]=='.')
row[cntr].x=i,row[cntr++].y=j;
lbr[i+1]=cntr;
if (lbr[i+1]==lbr[i]){flag=0;break;}
}
if (flag==0){
flag=2;
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
if (map[j][i]=='.')
col[cntc].x=j,col[cntc++].y=i;
lbc[i+1]=cntc;
if (lbc[i+1]==lbc[i]){flag=0;break;}
}}
if (flag==0) printf("-1\n");
else
{
if (flag==1)
{
cnt=1;
printf("%d %d\n",row[0].x+1,row[0].y+1);
for (i=1;i<cntr;i++)
{
if (row[i].x!=row[i-1].x) printf("%d %d\n",row[i].x+1,row[i].y+1),cnt++;
if (cnt==n) break;
}
}
else
{
cnt=1;
printf("%d %d\n",col[0].x+1,col[0].y+1);
for (i=1;i<cntc;i++)
{
if (col[i].y!=col[i-1].y) printf("%d %d\n",col[i].x+1,col[i].y+1),cnt++;
if (cnt==n) break;
}
}
}
return 0;
}