border points, for maximum score, we only need to check tokens whose border number is
0 and 1, for 0, just add all tokens, for 1, do a n**2 iteration and add those pairs whose
border number equals 1 and the border point is the same
/* Topcoder SRM */ /*****************************************************************************/ struct point { int x, y; inline bool operator==(const point &o) const { return x==o.x&&y==o.y; } }; struct token { int n; vector<point> p; inline bool operator==(const token &o) const { return sz(p)==1&&sz(o.p)==1&&p[0]==o.p[0]; } }; int n; int d[4][2]={{-1, 0}, {1, 0}, {0, 1}, {0, -1}}; int v[20][20]; int vb[20][20]; vector<token> t; void bfs(vector<string> &board, int i, int j) { token tk; tk.n=1; point s={i, j}; queue<point> q; q.push(s); v[i][j]=1; while (!q.empty()) { point c=q.front(); q.pop(); for (int i=0; i<4; i++) { int nx=c.x+d[i][0], ny=c.y+d[i][1]; if (nx<0||nx>=n||ny<0||ny>=n) { continue; } if (v[nx][ny]||board[nx][ny]=='x') { continue; } if (vb[nx][ny]) { continue; } if (board[nx][ny]=='.') { point adj={nx, ny}; tk.p.pb(adj); vb[nx][ny]=1; continue; } tk.n++; v[nx][ny]=1; point nc={nx, ny}; q.push(nc); } } t.pb(tk); } int FoxAndGo::maxKill(vector <string> board) { n=sz(board); t.clear(); memset(v, 0, sizeof(v)); for (int i=0; i<n; i++) { for (int j=0; j<n; j++) { if (v[i][j]||board[i][j]!='o') { continue; } memset(vb, 0, sizeof(vb)); bfs(board, i, j); } } int r=0; for (int i=0; i<sz(t); i++) { if (sz(t[i].p)==0) { r+=t[i].n; } } int rr=0; for (int i=0; i<sz(t); i++) { if (sz(t[i].p)!=1) { continue; } int cr=t[i].n; for (int j=i+1; j<sz(t); j++) { if (t[i]==t[j]) { cr+=t[j].n; } } rr=max(rr, cr); } return r+rr; } /*****************************************************************************/
No comments :
Post a Comment