poj1414dfs 搜索

xiaoxiao2021-02-27  338

给一个正三角形, 可以在任意一个 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; else return 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; else ans+=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); } }

转载请注明原文地址: https://www.6miu.com/read-5080.html

最新回复(0)