我正在编写游戏并需要一个函数来检查整数定义的2D数组中是否存在游戏(每个元素都是整数)。当2个或更多相等元素在位置,行方向或列方向上相邻时存在游戏。我已经按行进行了正常工作,但不管怎样,在按列检查时,它都无法正常工作。
这是我迄今为止所做的:
//Checks if in an array there are two or more adjacent elements
int adjArray(int arr[], int size)
{
int i = 0, flag = 0;
for( i = 0; i < size-1; i++)
{
if(arr[i] == arr[i+1])
{
flag = 1;
break;
}
}
return flag;
}
int func(int _board[][MAX_BOARD_POS], int numrows, int numcols)
{
int i = 0 , j = 0, flag = 0,arr[numrows];
for (i = 0; i < numrows; i++)
{
if (adjArray(_board[i],numcols) == 1)
{
flag = 1;
break;
}
}
//If there's a play row-wise, no need to check column-wise
if (!flag)
{
//Get array of column elements to use compareArray function
for ( i = 0; i < numcols; i++)
{
for (j = 0; j < numrows; j++)
{
arr[i] = _board[j][i];
}
if (adjArray(arr,numrows) == 1)
{
flag = 1;
break;
}
}
}
return flag;
}
我不知道我是否足够清楚。
奇怪的是,这些列正在准确打印,但不知何故adjarray(arr,numrows)
失败......
答案 0 :(得分:3)
您的代码非常接近......只有一个小错误:
for (i = 0; i < numcols; i++)
{
for (j = 0; j < numrows; j++)
{
arr[i] = _board[j][i];
}
如果仔细观察,很明显,在j
循环中,您只需继续在arr
中覆盖相同的元素,因为i
的值不会改变j
循环,所以这应该是
for (i = 0; i < numcols; i++)
{
for (j = 0; j < numrows; j++)
{
arr[j] = _board[j][i];
}
话虽如此,这里给出的其他一些方法也值得研究,我只是想你想知道为什么你的代码不能正常工作。
答案 1 :(得分:2)
对于列,如果您只需要检查2个连续元素是否相等,那么您需要
for(j = 0 ; j < numcols && !flag ; j++){
for(i = 0 ; i < numrows -1 && !flag ; i++){
if( _board[i][j] == _board[i+1][j])
flag= 1;
}
}
顺便提一下,我建议你使用标志作为for的一个条件,所以当你把它改为1(你找到了你想要的元素)时,它会从循环中弹出而不需要使用中断。我觉得这样更优雅。
希望有所帮助:)
答案 2 :(得分:2)
我没有测试它,所以可能有一些错误。
#include <stdbool.h>
#include <stddef.h>
#include <assert.h>
// size_t must be used for size, board[][X] should be avoid write (*board)[X] instead
// use bool if you want return true or false
bool func(int (*board)[MAX_BOARD_POS], size_t numrows, size_t numcols)
{
// could be just if depend or what you want
assert(numrows != 0 && numcols != 0);
// we loop on the first row manualy because board[0 - 1] will not make sense
for (size_t j = 1; j < numcols; j++) { // declare for loop increment IN the for loop
if (board[0][j] == board[0][j - 1])
{
return true;
}
}
// we loop on the remains rows
for (size_t i = 1; i < numrows; i++)
{
// we do the first manualy because board[i][0 - 1] will not make sense
if (board[i][0] == board[i - 1][0])
{
return true;
}
// we can finnaly check the two case in the same loop
for (size_t j = 1; j < numcols; j++) {
if (board[i][j] == board[i][j - 1] || board[i][j] == board[i - 1][j])
{
return true;
}
}
}
return false;
}