Linux环境下连连看游戏代码,《连连看》算法C语言演示(自动连连看)
时间: 2024-05-12 15:14:41 浏览: 121
很高兴为你介绍这个项目!以下是连连看游戏的C语言算法演示代码。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAXN 20
int a[MAXN][MAXN],n,m,sx,sy,tx,ty,f[MAXN][MAXN],ans=0x7f7f7f7f;
void dfs(int x,int y,int k,int step)
{
if(k==1)
{
if(step<ans) ans=step;
return;
}
if(step+f[x][y]>=ans) return;
int i,j;
for(i=x+1;i<=n;i++)
if(a[i][y])
{
if(i==tx&&y==ty)
{
dfs(i,y,k-1,step+1);
return;
}
if(!f[i][y])
{
f[i][y]=1;
dfs(i,y,k-1,step+1);
f[i][y]=0;
}
}
for(i=x-1;i>=1;i--)
if(a[i][y])
{
if(i==tx&&y==ty)
{
dfs(i,y,k-1,step+1);
return;
}
if(!f[i][y])
{
f[i][y]=1;
dfs(i,y,k-1,step+1);
f[i][y]=0;
}
}
for(j=y+1;j<=m;j++)
if(a[x][j])
{
if(x==tx&&j==ty)
{
dfs(x,j,k-1,step+1);
return;
}
if(!f[x][j])
{
f[x][j]=1;
dfs(x,j,k-1,step+1);
f[x][j]=0;
}
}
for(j=y-1;j>=1;j--)
if(a[x][j])
{
if(x==tx&&j==ty)
{
dfs(x,j,k-1,step+1);
return;
}
if(!f[x][j])
{
f[x][j]=1;
dfs(x,j,k-1,step+1);
f[x][j]=0;
}
}
}
int main()
{
int i,j,k,tot=0;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
if(a[i][j]) tot++;
}
if(tot%2)
{
printf("No solution\n");
return 0;
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(a[i][j])
{
k=a[i][j];
a[i][j]=0;
for(tx=1;tx<=n;tx++)
for(ty=1;ty<=m;ty++)
if(a[tx][ty]==k)
{
memset(f,0,sizeof(f));
sx=i;sy=j;
if(tx!=sx||ty!=sy)
{
f[sx][sy]=1;
dfs(sx,sy,tot/2,0);
if(ans==tot/2)
{
printf("(%d,%d)->(%d,%d)\n",i,j,tx,ty);
return 0;
}
}
}
a[i][j]=k;
}
printf("No solution\n");
return 0;
}
```
这个代码实现了一个自动连连看游戏,输入是一个 $n\times m$ 的矩阵,其中 $0$ 表示无图案,非 $0$ 的数字表示一个图案。程序会找到两个相同的图案,并在它们之间找到一条连接它们的路径。
该算法使用了 DFS(深度优先搜索)来遍历所有可能的路径,直到找到一条连接两个相同图案的路径,或者所有路径都被遍历完毕。
如果有解,程序会输出一条连接两个相同图案的路径,否则会输出 "No solution"。
希望这可以帮助你更好地了解算法和 C 语言编程。
阅读全文