嘿,我正在嘗試構建一個函式來檢查 N*N 矩陣是否至少有兩個相鄰(上下左右)相同的數字(數字從 0 到 h-1),如果有則回傳 1,如果有則回傳 0它沒有。我想首先沿著行檢查即將到來的元素是否相同,然后沿著列檢查。但是我必須小心處理最后一個元素,因為 board[n][j] 或 board[i][n] 不存在。這是我寫的,有沒有更快的方法來解決這個問題?另外,我的解決方案是否正確?
int check (game_t *p){
int i,j;
for (i=0;i<p->n;i ){
for (j=0;j<p->n-1;j ){
if(p->board[i][j]==p->board[i][j 1]) return 1;}}
for (j=0;j<p->n;j ){
for (i=0;i<p->n-1;i ){
if(p->board[i][j]==p->board[i 1][j]) return 1;}}
return 0;
}
結構博弈定義為:
typedef struct game {
int h;
int n;
int ** board;
} game_t;
uj5u.com熱心網友回復:
一點點的重組。我們可以將行鄰接測驗和列鄰接測驗組合成一個回圈。
在檢查給定的行時,我們可以與該行的先前值進行比較。但是,我們也可以根據下一行中它下面的值檢查該值。
我們可以在行值的單個回圈中執行此操作。所以,我們只需要一組嵌套for回圈而不是兩個。
我們在最后添加一個特殊回圈來檢查最后一行 [不檢查下一行]。
此外,通過添加一些額外的int *指標來指向被比較的行,我們可以簡化board矩陣索引并消除一些重復的額外指標/值提取。
這是重構后的代碼。注釋為:
typedef struct game {
int h;
int n;
int **board;
} game_t;
int
check(game_t *p)
{
int n = p->n;
int nm1 = n - 1;
int yidx;
int xidx;
int xcur;
int xprev;
int *rowtop;
int *rowbot;
// check most rows
yidx = 0;
for (; yidx < nm1; yidx) {
// point to current row of board
rowtop = p->board[yidx];
// point to next row of board
rowbot = p->board[yidx 1];
// get the "previous" value in the current row
xprev = rowtop[0];
// check all values in given row
for (xidx = 1; xidx < n; xidx, xprev = xcur) {
// get current value
xcur = rowtop[xidx];
// does it match the previous value in the row?
if (xcur == xprev)
return 1;
// check current value against value just below it in the next row
if (xcur == rowbot[xidx])
return 1;
}
}
// check last row
rowtop = p->board[yidx];
xprev = rowtop[0];
for (xidx = 1; xidx < n; xidx, xprev = xcur) {
xcur = rowtop[xidx];
if (xcur == xprev)
return 1;
}
return 0;
}
更新:
以上將作業并且相當快。
但是,我對速度感到“瘋狂”,因此,進行一個小調整以最大程度地減少記憶體提取[稍微]:
typedef struct game {
int h;
int n;
int **board;
} game_t;
int
check(game_t *p)
{
int n = p->n;
int nm1 = n - 1;
int yidx;
int xidx;
int xcur;
int xprev;
const int *rowtop;
const int *rowbot;
// check most rows
rowbot = p->board[0];
for (yidx = 1; yidx < nm1; yidx) {
// point to [new] current row of board
rowtop = rowbot;
// point to next row of board
rowbot = p->board[yidx];
// get the "previous" value in the current row
xprev = rowtop[0];
// check all values in given row
for (xidx = 1; xidx < n; xidx, xprev = xcur) {
// get current value
xcur = rowtop[xidx];
// does it match the previous value in the row?
if (xcur == xprev)
return 1;
// check current value against value just below it in the next row
if (xcur == rowbot[xidx])
return 1;
}
}
// check last row
rowtop = rowbot;
xprev = rowtop[0];
for (xidx = 1; xidx < n; xidx, xprev = xcur) {
xcur = rowtop[xidx];
if (xcur == xprev)
return 1;
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/348676.html
