直接模拟即可,最近码力太渣多敲敲
#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;
}