HDU1045【贪心】
按照所影响的格子的个数从小到大排序,一个一个选。
也可以按照网络流的方法来做,具体参考http://www.cnblogs.com/Lnizei/p/4072122.html和http://www.cnblogs.com/Lnizei/p/4072341.html
#include<cstdio> #include<string> #include<queue> using namespace std; const int NO=6; struct X { int i,j,s; bool operator <(const X &b)const{return s>b.s;} }p[NO][NO],x; char map[NO][NO]; bool mark[NO][NO]; int main() { int n,i,j,k; for(i=1;i<=4;i++) for(j=1;j<=4;j++) p[i][j].i=i,p[i][j].j=j; while(scanf("%d",&n),n) { priority_queue<X> t; memset(map,'X',sizeof(map)); for(i=1;i<=n;i++) { getchar(); for(j=1;j<=n;j++) { p[i][j].s=0; mark[i][j]=0; map[i][j]=getchar(); } } for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(map[i][j]=='.') { for(k=i-1;k>=0;k--)//纵向找端点 if(map[k][j]=='X') { k++; break; } for(;k<=n;k++) if(map[k][j]=='.') p[i][j].s++; else break; for(k=j-1;k>=0;k--)//横向找端点 if(map[i][k]=='X') { k++; break; } for(;k<=n;k++) if(map[i][k]=='.') p[i][j].s++; else break; t.push(p[i][j]); } else mark[i][j]=1; int s=0; while(!t.empty()) { x=t.top(); t.pop(); if(mark[x.i][x.j]) continue; mark[x.i][x.j]=1; s++; for(k=x.i-1;k>=0;k--)//纵向找端点 if(map[k][x.j]=='X') { k++; break; } for(;k<=n;k++) if(map[k][x.j]=='.') mark[k][x.j]=1; else break; for(k=x.j-1;k>=0;k--)//横向找端点 if(map[x.i][k]=='X') { k++; break; } for(;k<=n;k++) if(map[x.i][k]=='.') mark[x.i][k]=1; else break; } printf("%d\n",s); } return 0; }

浙公网安备 33010602011771号