记录编号 185785 评测结果 AAAAAAAAAA
题目名称 [ZOJ 1654]放置机器人 最终得分 100
用户昵称 Gravatarforever 是否通过 通过
代码语言 C++ 运行时间 0.054 s
提交时间 2015-09-09 08:33:51 内存使用 1.77 MiB
显示代码纯文本
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
using namespace std;
int head[3000],n,m,ans,num1,Num,tot,match[3000],a[51][51];
bool vis[3000];
char ch;
struct dd{
	int c[51];
	int b[51];
	int num;
}jie[4000];
struct df{
	int begin,end,next;
}st[4000];
void add(int x,int y){
	st[++tot].begin=x; st[tot].end=y; st[tot].next=head[x]; head[x]=tot;
}
void Build(){
	int q,w;
	for(int i=1;i<=n;++i){
	   q=i,w=1;
	   while(1==1){
        if(a[w][q]!=1) num1++;
		while(a[w][q]!=1&&w<=m){
			   jie[num1].num++;
			   jie[num1].b[jie[num1].num]=w;
			   jie[num1].c[jie[num1].num]=i;
			   w++;
			}
			w++;
			if(w>m) break;
	  }
	}
	Num=num1;
	for(int i=1;i<=m;++i){
		q=i,w=1;
		while(1==1){
		if(a[q][w]!=1) num1++;
		while(a[q][w]!=1&&w<=n){
				jie[num1].num++;
				jie[num1].b[jie[num1].num]=q;
				jie[num1].c[jie[num1].num]=w;
				w++;
		}
		w++;
		if(w>n) break;
	   }
	}
}
void End(){
	for(int i=1;i<=Num;++i)
	 for(int q=1;q<=jie[i].num;++q)
	  for(int j=Num+1;j<=num1;++j)
	   for(int w=1;w<=jie[j].num;++w)
		if(jie[i].b[q]==jie[j].b[w]&&jie[i].c[q]==jie[j].c[w]&&a[jie[i].b[q]][jie[i].c[q]]==3)
		   add(i,j);
}
bool dfs(int x){
	int w;
	for(int i=head[x];i;i=st[i].next){
	   w=st[i].end;
	   if(!vis[w]){
			vis[w]=1;
            if(!match[w]||dfs(match[w])){
			   match[w]=x;
			   return 1;
	        }
	   }
	}
	return 0;
}
void work(){
	  for(int i=1;i<=num1;++i){
		memset(vis,0,sizeof(vis));
		if(dfs(i)) ans++;
	  }
	  printf("%d",ans);
}
void Work(){
     Build(); End(); work();
}
int main(){
     freopen("placetherobots.in","r",stdin);
    freopen("placetherobots.out","w",stdout);
	scanf("%d%d",&m,&n);
	for(int i=1;i<=m;++i)
	 for(int j=1;j<=n;++j){
	   cin>>ch;
	   if(ch=='#'){a[i][j]=1;continue;}
	   if(ch=='*'){a[i][j]=2;continue;}
	   if(ch=='o'){a[i][j]=3;continue;}
	 }
	 Work();
}