“水果消除”是一款手机游戏,相信大家都玩过或玩过类似的游戏。
下面是“水果消除”游戏的一种初始状态。
消除的基本规则:如果有2个或2个以上的相同水果连在一起,则可以点选并消除。
请问在某一种状态下,有几种可以点选并消除的选择方案。
例如,对于上图所示的初始状态,将有6种点选并消除的选择方案。这6种方案依次如下图所示。
输入
先输入一个整数n,表示放水果的格子总数为n*n。n取3到1000之间的整数(含3和1000)。
然后依次输入n*n个表示水果的数据,不同的水果用不同的数字表示,同一种水果用相同的数字表示。
表示水果的数字编号从1开始,不超过100。
输出
在输入数据对应的初始状态下,有几种点选并消除的选择方案。
输出方案数。
样例输入
6
1 1 2 2 2 2
1 3 2 1 1 2
2 2 2 2 2 3
3 2 3 3 1 1
2 2 2 2 3 1
2 3 2 3 2 2
样例输出
6
回溯法
#include<cstdio>
using namespace std;
#define N 1005
int A[N][N]={-1};
int n,ans=0;
void findPath(int x,int y,int A[N][N])
{
int top=0,stack[105][2];
int fruit=A[x][y];
A[x][y]=0;
stack[top][0]=x;
stack[top][1]=y;
int is_sur =0;
while(1)
{
//printf("(%d,%d)->",x+1,y+1);
int ok=0;
//搜索到与之相等的颜色就消掉,该点置为0
if(y+1<n &&A[x][y+1]==fruit){y++;ok=1;A[x][y]=0;}//right
else if(x+1<n &&A[x+1][y]==fruit){x++;ok=1;A[x][y]=0;}//down
else if(y-1>=0&&A[x][y-1]==fruit){y--;ok=1;A[x][y]=0;}//left
else if(x-1>=0&&A[x-1][y]==fruit){x--;ok=1;A[x][y]=0;}//up
if(ok==1)
{
is_sur++;
//continue find path
top++;
stack[top][0]=x;//把当前值压入栈中
stack[top][1]=y;
}
else
{
if(top<=0)
{
break;//栈空,退出循环
}
else
{
top--;
x=stack[top][0];//条件不匹配出栈
y=stack[top][1];
}
}
}
if(is_sur>=1)//判断是否可以消除
{
ans++;
}
}
int main()
{
scanf("%d",&n);
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
scanf("%d",&A[i][j]);
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
if(A[i][j]!=-1 &&A[i][j]!=0)
findPath(i,j,A);//若该点存在则开始搜索路径
}
printf("%d\n",ans);
}