我正在设计一个具有2D阵列的游戏引擎:
0,1,1,2,0
0,1,2,1,1
1,0,1,0,2
2,1,2,0,0
2,0,1,0,0
我被困在“游戏结束”状态,因为它必须检查1或2是否已连接。 它应该声明玩家1是赢家并返回:
1 1
1 1 1
1 1
1
1
1
我尝试通过检查数组中的每个位置并在所有8个方向检查其邻居来尝试使用递归,但该方法需要45秒才能运行,效率很低。
有没有人有任何想法?一个伪代码示例将被赞赏(我是一个慢学习者)。
答案 0 :(得分:1)
以下是一些提示:
boolean
矩阵和计数器来跟踪您已检查过哪些以及有多少个。答案 1 :(得分:1)
答案 2 :(得分:0)
这个问题并不那么容易。在我看来,您可以将矩阵看作图表,然后尝试查看图表是否已连接。即是1s连接的图形,是连接的2s的图形。在这里,您会看到few algorithms。由于您正在创建图形,您还可以跟踪玩家正在创建的节点组,并且在创建新节点时,您可以检查新节点连接的组数和并联新节点所连接的任何组(或者如果没有连接任何内容,请创建一个包含新节点的新组。
顺便说一句,你可以将任何递归转换为循环,但只有当你的堆栈耗尽时才应该这样做。
答案 3 :(得分:0)
从头开始维护UnionFind数据结构,每个条目代表每个单元格。最初,在相邻单元格上使用相同的值执行联合。当玩家标记一个单元格时,如果该值与玩家的值相同,则对相邻单元格执行union()。在联合查找中,您可以跟踪具有值的单元格数量,当该数字等于插入值的次数时,您就有赢家。
您也可以使用描述为here
的算法进行线性处理答案 4 :(得分:0)
如果a[n][n]
和a[i][j] = 1
已连接,请继续使用i
制作重复的图表j
。
然后您可以执行以下操作:
int count = 0;
void dfs(int i)
{
int k;
for(k = 0; k < n; k++)
{
if(A[i][k] == 1 && !visited[k])
{
count++;
visited[k] = 1;
dfs(k);
}
}
}
for(i=0; i < n;i++)
{
if(!visited[i])
{
count=1;
visited[i]=1;
dfs(i);
// map i with count .. here
}
}
因此,一旦您使用其中一个节点映射了网络中节点的计数。
您会找到值计数,如果计数== total_no_of_1
如果是,则连接网络1.如果不是,那么与2的相同并且声明结果。