Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

BOJ 387

$
0
0

直接模拟即可,最近码力太渣多敲敲

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
char map[10][10];
int ans;
struct Node{
    int x,y;
};
int dir[2][8]={1,-1,0,0,1,1,-1,-1,0,0,1,-1,-1,1,1,-1};

bool ok(int x,int y){
    if(x>=0 && x<10 && y>=0 && y<10)return 1;
    return 0;
}

bool init(){
    int i,j,p,q;
    for(i=0;i<10;i++)
        for(j=0;j<10;j++){
            if(map[i][j]=='.')continue;
            for(p=0;p<8;p++){
                for(q=1;;q++){
                    int x=i+q*dir[0][p],y=j+q*dir[1][p];
                    if(ok(x,y)==0)break;
                    if(map[x][y]!=map[i][j])break;
                }
                if(q>4) return 1;
            }
        }
    return 0;
}

void count(int s,int t){  //这里如果只搜(s,t)八个方向上的点更快些
    int i,j,p,q;
    bool vis[10][10];
    memset(vis,0,sizeof(vis));
    for(i=0;i<10;i++)
        for(j=0;j<10;j++){
            if(map[i][j]!=map[s][t])continue;
            for(p=0;p<8;p++){
                for(q=1;;q++){
                    int x=i+q*dir[0][p],y=j+q*dir[1][p];
                    if(ok(x,y)==0)break;
                    if(map[x][y]!=map[i][j])break;
                }
                if(q>4){
                    for(int qq=0;qq<q;qq++) vis[i+qq*dir[0][p]][j+qq*dir[1][p]]=1;
                }
            }
        }
    int sum=0;
    for(i=0;i<10;i++)
        for(j=0;j<10;j++)
            sum+=vis[i][j];
    ans=max(ans,sum);
}

bool move_ok(int s,int t){
    int i,j;
    for(i=0;i<8;i++){
        int x=s+dir[0][i],y=t+dir[1][i];
        if(ok(x,y)==0)continue;
        if(map[x][y]==map[s][t])return 1;
    }
    return 0;
}

void dfs(int x,int y){
    int i,j;
    bool vis[10][10];
    struct Node t1,t2;
    queue<struct Node>q;
    t1.x=x,t1.y=y;
    q.push(t1);
    memset(vis,0,sizeof(vis));
    vis[x][y]=1;
    bool yes=0;
    while(!q.empty()){
        t1=q.front();
        q.pop();
        if(!yes){
            yes=1;
        }
        else{
            swap(map[x][y],map[t1.x][t1.y]);
            if(move_ok(t1.x,t1.y))
                count(t1.x,t1.y);
            swap(map[x][y],map[t1.x][t1.y]);
        }
        for(i=0;i<4;i++){
            int xx=t1.x+dir[0][i],yy=t1.y+dir[1][i];
            if(ok(xx,yy)==0 || map[xx][yy]!='.' || vis[xx][yy])continue;
            t2.x=xx,t2.y=yy,vis[xx][yy]=1;
            q.push(t2);
        }
    }
}

int solve(){
    int i,j;
    if(init())return -1;
    ans=0;
    for(i=0;i<10;i++)
        for(j=0;j<10;j++){
            if(map[i][j]=='.')continue;
            dfs(i,j);
        }
    return ans;
}

int main(){
    int i,T=0;
    while(scanf("%s",map[0])!=EOF){
        for(i=1;i<10;i++) scanf("%s",map[i]);
        int ans=solve();
        if(T>0)puts("");
        if(ans==-1)printf("Case #%d: Waiting!\n",++T);
        else printf("Case #%d: %d\n",++T,ans);
    }
    return 0;
}


作者:waitfor_ 发表于2013-3-17 23:14:29 原文链接
阅读:40 评论:0 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>