poj 1414 dfs 搜索

来源:互联网 发布:淘宝个人网店怎么注册 编辑:程序博客网 时间:2024/06/07 06:56

给一个正三角形, 可以在任意一个 0 的地方填上数字 c   ,填完之后计算出得分的最大值。

计算得分的规则:

 相同数字的连通的集合  如果和某个0连通,就忽略了。

 如果没有和0连通,分2种情况: 如果这个数字是c 则得分减去 这个集合中数字的个数,否则加上。

#include<cstdio>#include<cstring>#define MAX(x,y) ((x)>(y)?(x):(y))int mov[6][2]={{0,-1},{0,1},{-1,-1},{-1,0},{1,0},{1,1}};int flag,n,c,vis[11][11],d[20][20],res;int ok(int x,int y){if(x>=1&&x<=n&&y>=1&&y<=x)return 1;elsereturn 0;}int dfs(int x,int y,int sym) // 计算  数字sym连通集合中该数字的个数{vis[x][y]=1;int step=1;for(int i=0;i<6;i++){int x1=x+mov[i][0];int y1=y+mov[i][1];if(ok(x1,y1)&&!vis[x1][y1]){if(d[x1][y1]==sym)step+=dfs(x1,y1,sym);if(d[x1][y1]==0)flag=1;}}return step;}void solve(){res=-10000;for(int i=1;i<=n;i++)//枚举每一个可以放c的地方for(int j=1;j<=i;j++){if(d[i][j]==0){int ans=0,tem;d[i][j]=c;memset(vis,0,sizeof(vis));for(int k=1;k<=n;k++)for(int p=1;p<=k;p++){if(vis[k][p]||d[k][p]==0)continue;flag=0;tem=dfs(k,p,d[k][p]);if(!flag){if(d[k][p]==c)ans-=tem;elseans+=tem;}}d[i][j]=0;res=MAX(res,ans);}}}int main(){while(~scanf("%d%d",&n,&c)&&(n+c)){for(int i=1;i<=n;i++)for(int j=1;j<=i;j++)scanf("%d",&d[i][j]);solve();printf("%d\n",res);}}


0 0
原创粉丝点击