尽管我已按升序初始化数组,但我无法使此函数返回true。
bool won(int gameBoard[][SIZE])
{
for(int i=0;i<SIZE;i++)
{
for(int j=0;j<SIZE;j++)
{
if(gameBoard[i][j]>gameBoard[i][j+1]||gameBoard[i][j]>gameBoard[i+1][0])
{
return false;
}
}
}
return true;
}
答案 0 :(得分:5)
您的代码中存在两个问题。
<强> 1。在某个阶段,i和j的值会超出范围。
<强> 2。检查数组是否按升序排序的条件是错误的。
让我们逐一解决
- 要保持i,j的值在范围内,请像这样更改for循环
醇>
for(int i=0;i<SIZE;i++)
{
for(int j=0;j<SIZE;j++)
{
}
}
for(int i=0;i<SIZE-1;i++)
{
for(int j=0;j<SIZE-1;j++)
{
}
}
您的计划遇到的错误是当j
的值变为SIZE-1
时您正在检查gameBoard[i][j]>gameBoard[i][j+1]
。但gameBoard[i][j+1]
会尝试访问gameBoard[i][SIZE]
并且您知道该索引中没有值,因为您将值从0保存到SIZE-1。
当您的程序检查最后一行时,i
会出现同样的问题。
- 要修复检查条件
醇>if the array is in ascending order or not
,请更改您的条件:
if(gameBoard[i][j]>gameBoard[i][j+1]||gameBoard[i][j]>gameBoard[i+1][0])
if((j!=SIZE-2 && gameBoard[i][j]>gameBoard[i][j+1])
||(j==SIZE-2 && ((gameBoard[i][j]>gameBoard[i][j+1])||(gameBoard[i][j+1]>gameBoard[i+1][0])))
当j
的索引小于SIZE-2
时,比较gameBoard[i][j]
&amp; gameBoard[i][j+1]
并查看它们是否违反了条件。但当j
的索引等于SIZE-2
时,我们必须比较两件事。一个是比较gameBoard[i][j]
下一个元素gameBoard[i][j+1]
,另一个是将j
的下一个元素与下一行第一个元素gameBoard[i+1][0]
进行比较。
N:B:只有那时您应该检查gameBoard[i][j]
是否大于gameBoard[i+1][0]
,而不是每次都检查。
答案 1 :(得分:3)
这是一个更安全的版本,不需要进行任何比较或检查包含在每行开头的索引,所有这些都使用std::is_sorted算法函数。
#include <algorithm>
// Assuming that the array is 10 x 10
#define SIZE 10
bool won(int gameBoard[][SIZE])
{
return std::is_sorted(&gameBoard[0][0], &gameBoard[SIZE-1][SIZE]);
}
由于2D数组是连续的,因此无需编写循环,因为范围从第一个项目的地址开始到整个2D数组中最后一个项目之后的地址。