这道题有点烦,不过题目还是简单的。每次操作之后,重新将小球的状态
设置一下, 就OK了
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int n=10,m=15;
char str[100][100];
int step;//存储每次搜索的找到的小球个数
int xx[4]= {0,0,1,-1},yy[4]= {1,-1,0,0};//搜索的四个方向
int vis[101][101];//储存即将删去的小球,将其对应坐标变1
void dfs(int x,int y)
{
vis[x][y]=1;
for(int i=0; i<4; i++)
{
int X=xx[i]+x,Y=yy[i]+y;
if(X>=1&&Y>=1&&X<=n&&Y<=m)
{
if(str[X][Y]!=' '&&!vis[X][Y]&&str[X][Y]==str[x][y])
{
vis[X][Y]=1;
step++;
dfs(X,Y);
}
}
}
return ;
}
int main()
{
int t,kj2=0;
scanf("%d",&t);
while(t--)
{
getchar();
for(int i=n; i>=1; i--)
for(int j=1; j<=m; j++)
cin>>str[i][j];
int ac=0;//本人最爱的变量名
int defen=0;//最终的得分
int shengyu=150;//最终的剩余的球的个数
kj2++;
while(1)
{
ac++;
int sum=0;
if(ac==1)
printf("Game %d:\n\n",kj2);
memset(vis,0,sizeof(vis));
int ki,kj;
int max=1;
for(int j=1;j<=m;j++)
{
for(int i=1;i<=n;i++)
{
if(vis[i][j]==0&&str[i][j]!='.')
{
step=1;
dfs(i,j);
if(step>max)
{
ki=i,kj=j;
max=step;
}
}
}
}
if(max==1)//经过搜索如果没有连续两个以上的球结束。
{
if(shengyu==0)
defen+=1000;
printf("Final score: %d, with %d balls remaining.\n\n",defen,shengyu);
break;
}
sum=(max-2)*(max-2);//得分计算
shengyu-=max;//减去删除的球
defen+=sum;
printf("Move %d at (%d,%d): removed %d balls of color %c, got %d points. \n",ac,ki,kj,max,str[ki][kj],sum);
memset(vis,0,sizeof(vis));
dfs(ki,kj);
for(int j=1; j<=m; j++)//将小球落下去的操作
{
int cnt=1;
char ss[101];
for(int i=1; i<=n; i++)
{
if(vis[i][j]==0&&str[i][j]!='.')
{
ss[cnt++]=str[i][j];
}
}
ss[cnt]='\0';
if(cnt!=1)
for(int i=1; i<cnt; i++)
str[i][j]=ss[i];
else
str[1][j]='.';
for(int i=cnt; i<=n; i++)
str[i][j]='.';
}
int qq=0;
while(1)//将一列都为空的,把小球往左移动,while循环一直将其移动到一起。
{
qq++;
for(int j=1; j<m; j++)
{
if(str[1][j]=='.')
{
for(int i=1; i<=n; i++)
{
if(str[i][j+1]!='.')
str[i][j]=str[i][j+1];
}
for(int i=1; i<=n; i++)
str[i][j+1]='.';
}
}
int kk=0,ff=0;
for(int j=1; j<=m; j++)
{
if(str[1][j]=='.')
{
ff=1;
}
if(ff==1&&str[1][j]!='.')
kk=1;
}
if(kk==0)
break;
}
}
}
return 0;
}
设置一下, 就OK了