據說這是水題~~三點二十做到四點四十水了三個題,後面的題目真長!
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;
}