BOJ 387

来源:互联网 发布:软件测试论坛网站 编辑:程序博客网 时间:2024/05/22 03:13

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

#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;}


原创粉丝点击