POJ 1414 暴搜

题意比较复杂 (但是很好理解)
大概意思是给你等边三角形(详见题目中的图)。
最后一行有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前三 哈哈哈哈
这里写图片描述

posted @ 2016-07-23 16:36  SiriusRen  阅读(152)  评论(0编辑  收藏  举报