PKU POJ 1414 Life Line 搜索
题目很简单,就是在题目给点的区域划分下,判定哪些个区域和0相接,以及计算每个区域的节点数。
搜索可以做,要注意搜索方向的设置。
#include<iostream> using namespace std; int n,c,s[15][15]; bool flag[15][15]; int dir[6][2]={{-1,0},{-1,-1},{0,-1},{1,1},{0,1},{1,0}}; inline bool judge(int x,int y) { return x>0&&y>0&&x<=n&&y<=x; } bool dfs(int x,int y,int& cnt)//return true if adjacent to 0 { flag[x][y]=true; ++cnt; bool f=false; int i,j; for (i=0;i<6;++i) { int x1=x+dir[i][0],y1=y+dir[i][1]; if (judge(x1,y1)) { if (s[x1][y1]==0) f=true; else if (s[x1][y1]==s[x][y]&&!flag[x1][y1]) if(dfs(x1,y1,cnt)) f=true; } } return f; } int cal(int x,int y) { s[x][y]=c; int i,j,total=0; memset(flag,false,sizeof(flag)); for (i=1;i<=n;++i) for(j=1;j<=i;++j) if (!flag[i][j]&&s[i][j]!=0) { int tmp=0; if (!dfs(i,j,tmp)) { if (s[i][j]==c) total-=tmp; else total+=tmp; } } s[x][y]=0; return total; } int main() { int i,j,max; while (scanf("%d%d",&n,&c)!=EOF&&!(n==0&&c==0)) { for (i=1;i<=n;++i) for(j=1;j<=i;++j) scanf("%d",&s[i][j]); max=-1000000; for (i=1;i<=n;++i) for (j=1;j<=i;++j) if (s[i][j]==0) { int tmp=cal(i,j); if (tmp>max) max=tmp; } printf("%d\n",max); } return 0; }
浙公网安备 33010602011771号