标签:des style color os io for ar div
5 5 35552 31154 33222 21134 12314
32Hint35552 00552 00002 00002 00000 00000 31154 05154 05104 00004 00002 00000 33222 01222 01222 00122 00104 00100 21134 21134 21134 25234 25234 25230 12314 12314 12314 12314 12314 12312 The total point is 12+6+6+2+6=32.
思路:DFS找最大的联通块消去。注意向左移动的时候连续两列都为空的情况。
#include <stdio.h> int n,m,total,nxt[4][2]={{0,-1},{-1,0},{1,0},{0,1}}; bool vis[20][20]; char d[20][21]; void dfs(int x,int y,int num) { for(int i=0;i<4;i++) { x+=nxt[i][0]; y+=nxt[i][1]; if(x>=0 && x<n && y>=0 && y<m && !vis[x][y] && d[x][y]==num) { vis[x][y]=1; total++; dfs(x,y,num); } x-=nxt[i][0]; y-=nxt[i][1]; } } void tran(int x,int y,int num) { for(int i=0;i<4;i++) { x+=nxt[i][0]; y+=nxt[i][1]; if(x>=0 && x<n && y>=0 && y<m && d[x][y]==num) { d[x][y]='0'; tran(x,y,num); } x-=nxt[i][0]; y-=nxt[i][1]; } } int main() { int i,j,k,mx,x,y,ans,remain,t; while(~scanf("%d%d",&n,&m)) { for(i=0;i<n;i++) scanf("%s",d[i]); ans=0; remain=n*m; while(remain) { mx=0; for(i=0;i<n;i++) for(j=0;j<m;j++) vis[i][j]=0; for(i=0;i<n;i++) { for(j=0;j<m;j++) { if(d[i][j]>'0' && !vis[i][j]) { vis[i][j]=1; total=1; dfs(i,j,d[i][j]); if(total>mx) { mx=total; x=i; y=j; } } } } remain-=mx; ans+=mx*(mx-1); tran(x,y,d[x][y]); d[x][y]='0'; for(i=n-1;i>=0;i--)//向下移动 { for(j=0;j<m;j++) { if(d[i][j]=='0') { for(k=i-1;k>=0;k--) { if(d[k][j]>'0') { d[i][j]=d[k][j]; d[k][j]='0'; break; } } } } } t=m-1; while(t--)//向左移动,注意连续两列都为空的情况 { for(j=0;j<m-1;j++) { for(i=0;i<n;i++) if(d[i][j]>'0') break; if(i==n) { for(i=0;i<n;i++) { d[i][j]=d[i][j+1]; d[i][j+1]='0'; } } } } } printf("%d\n",ans); } }
HDU-2258-Continuous Same Game (1)(DFS),布布扣,bubuko.com
HDU-2258-Continuous Same Game (1)(DFS)
标签:des style color os io for ar div
原文地址:http://blog.csdn.net/faithdmc/article/details/38542513