题意比较复杂 (但是很好理解)

大概意思是给你等边三角形(详见题目中的图)。

最后一行有n个数,下一次要填的数是c。

里面预先已经填好了数字。(0为未填)

得分的标准是这个分数的连通块周围没有空的地方。 就能得到连通块大小的分。

失分是 当前块能得分,但不巧,当前块内的数字是要填的数字。就失去连通块大小的分。

求这次填块最多可以得多少分。

不能不填,即分数可以为负。

思路:

其实这个题并不难。

枚举所有没有填过的块。暴搜一遍。。。 搞定。

// by SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ff for(int i=1;i<=n;i++)for(int j=1;j<=i;j++)
using namespace std;
int n,c,vis[11][11],a[11][11],xx[]={1,0,-1,0,-1,1,0},yy[]={0,1,0,-1,-1,1,0},cnt,flag,temp,ans;
bool check(int x,int y){return x>=1&&y<=x&&y>=1&&x<=n;}
void dfs(int x,int y,int t){
vis[x][y]=1;cnt++;
for(int i=0;i<6;i++){
int dx=x+xx[i],dy=y+yy[i];
if(!vis[dx][dy]&&check(dx,dy)){
if(a[dx][dy]==t)dfs(dx,dy,t);
else if(!a[dx][dy])flag=1;
}
}
}
int main(){
while(scanf("%d%d",&n,&c)&&(n||c)){
ans=-0x3fffffff;
ff scanf("%d",&a[i][j]);
ff if(!a[i][j]){
memset(vis,0,sizeof(vis));
a[i][j]=c;
temp=0;
for(int k=0;k<=6;k++){
cnt=flag=0;
int dx=i+xx[k],dy=j+yy[k];
if(check(dx,dy)&&!vis[dx][dy]&&a[dx][dy])dfs(dx,dy,a[dx][dy]);
if(!flag){
if(a[dx][dy]==c)temp-=cnt;
else temp+=cnt;
}
}
ans=max(ans,temp);
a[i][j]=0;
}
printf("%d\n",ans);
}
}

一不小心还进了Code Length前三 哈哈哈哈

POJ  1414 暴搜-LMLPHP

05-11 20:07