广度优先搜索:
连连看
#include <stdio.h>
#include <string.h>
char aa[6*6+1]={"ABF...CE....D....$..#.%D....EC...FBA"}; // %,#为阻挡
// 0 1 2 3 4 5
// 0 A B F . . .
// 1 C E . . . .
// 2 D . . . . #
// 3 . . % . $ D
// 4 . . . . E C
// 5 . . . F B A
int biaoji[6*6];
int que[6*6]; // 队列,存放待搜索节点
int pos[4][2]={0,1,1,0,-1,0,0,-1};
int bfs(char *aa, int x, int y)
{
int s=0; // 队列开始
int e=0; // 队列结尾
que[s]=x*6+y;
memset(biaoji, 0, sizeof(int)*6*6);
biaoji[x*6 + y]=1;
while (s<=e) // 队列中还有数
{
int x0 = que[s]/6;
int y0 = que[s]%6;
int m;
for (m=0; m<4; m++)
{
int x1=x0+pos[m][0];
int y1=y0+pos[m][1];
if (x1>=0 && x1<6 &&
y1>=0 && y1<6 &&
biaoji[x1*6 + y1] ==0 &&
(aa[x1*6+y1]=='.' || aa[x1*6+y1]==aa[x*6+y]) )
{
biaoji[x1*6 + y1]=1;
if ( aa[x1*6+y1]==aa[x*6+y]) // 如果找到配对的点
{
printf("%c : (%d,%d)-(%d,%d)\n", aa[que[0]], x,y, x1, y1);
aa[x1*6+y1]='.';
aa[x*6+y]='.';
return 1;
}
e++;
que[e]=x1*6+y1;
}
///
}
s++;
}
return 0;
}
int main()
{
int i,j;
int x=0;
while (x<6) // 成功找出6个字母才结束循环
{
for (i=0; i<6; i++)
{
for (j=0; j<6; j++)
{
if (aa[i*6+j] !='.')
{
int u=bfs(aa,i,j);
x+=u;
}
}
}
}
char ch;
ch=getchar();
return 0;
}
将阻挡去掉:
char aa[6*6+1]={"ABF...CE....D..........D....EC...FBA"}; // %,#为阻挡
// 0 1 2 3 4 5
// 0 A B F . . .
// 1 C E . . . .
// 2 D . . . . .
// 3 . . . . . D
// 4 . . . . E C
// 5 . . . F B A
结果为: