记录编号 150162 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队2011]部落战争 最终得分 100
用户昵称 Gravatarnew ioer 是否通过 通过
代码语言 C++ 运行时间 0.008 s
提交时间 2015-02-28 07:49:13 内存使用 0.53 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<cstring>
  3. int n,m,r,c,tv,tmp,ans,len,dx[4],dy[4],g[6000],v[6000],pre[6000],to[20001],next[20001],hash[60][60];
  4. char map[60][60];
  5. void add(int x,int y){
  6. to[++len]=y,next[len]=g[x],g[x]=len;
  7. }
  8. bool dfs(int x){
  9. for(int t,i=g[x];i;i=next[i]){
  10. if(v[t=to[i]]!=tv){
  11. v[t]=tv;
  12. if(pre[t]==-1||dfs(pre[t]))
  13. return pre[t]=x,1;
  14. }
  15. }
  16. return 0;
  17. }
  18. int main(){
  19. freopen("lanzerb.in","r",stdin);
  20. freopen("lanzerb.out","w",stdout);
  21. scanf("%d%d%d%d",&n,&m,&r,&c),tmp=n*m,tv=1;
  22. dx[0]=r,dx[1]=r,dx[2]=c,dx[3]=c;
  23. dy[0]=-c,dy[1]=c,dy[2]=-r,dy[3]=r;
  24. for(int i=0;i<n;i++) scanf("%s",map[i]);
  25. for(int k=0,i=0;i<n;i++)
  26. for(int j=0;j<m;j++)
  27. hash[i][j]=k++;
  28. for(int i=0;i<n;i++)
  29. for(int j=0;j<m;j++){
  30. if(map[i][j]=='x') continue;
  31. ans++;
  32. for(int k=0;k<4;k++){
  33. int nx=i+dx[k],ny=j+dy[k];
  34. if(nx<0||nx>=n||ny<0||ny>=m||map[nx][ny]=='x') continue;
  35. add(hash[i][j],hash[nx][ny]+tmp);
  36. }
  37. }
  38. memset(pre,-1,sizeof pre);
  39. for(int i=0;i<tmp;i++,tv++) ans-=dfs(i);
  40. printf("%d",ans);
  41. }