1

所以我这样做是为了做作业,我不知道我的错误在哪里。非常感谢任何帮助。

我的理解是这样的。

  1. 初始化一个堆栈以跟踪哪一行和哪一列有皇后。
  2. 在第一个方格上放置一个皇后,将其位置推入堆栈。推(0,0);然后设置该行已被填充的变量。填充+;

3.然后循环

检查当前行或列是否与另一个皇后发生冲突。

一个。没有冲突。推入堆栈。增加填充的行变量。填充++;向上移动一排。

湾。有冲突。向右移。科尔++;

C。不能再向右移动了。弹出堆栈并设置为行和列。减去填充。然后移过去。科尔++;然后再试一次。


int main(){


bool board[8][8];

for(int i = 0; i < 8; i++){
    for(int j = 0; j < 8; j++){
        board[i][j] = false;}}

int row = 0, col = 0, filled = 0;

StackLi<int> rowStack;
StackLi<int> colStack;

rowStack.push(row);
colStack.push(col);

board[row][col] = true;
//cout << "push: " << "(" << row << "," << col << ")" << endl;  
row++;


while(filled < 7)
{
    if(!isSafe(board,row,col) )
        {
        filled++;
        rowStack.push(row);
        colStack.push(col);
        board[row][col] = true;
    //cout << "push: " << "(" << row << "," << col << ")" << endl;  
        if(filled > 8)
            {
            print(board);
            return 0;
            }
        row++;
    }
    else{
col++;
    //cout << "move: " << "(" << row << "," << col << ")" << endl;  
    }

    if(col > 7)
{
       row = rowStack.topAndPop();
       col = colStack.topAndPop();
   board[row][col] = false;
       cout << "pop: " << "(" << row << "," << col << ")" << endl;  
   filled--;
}

}

return 0;

}

bool isSafe(bool board[8][8], int row, int col)
{


for(int i = 0; i < 8; i++)
{
    if(board[row][i] || board[i][col]) return true;
}

for(int i = 0; (row - i)>=0 && (col-i) >= 0; i++)
{
    if(board[row-i][col-i]) return true;
}

for(int i = 0; (row - i)<=8 && (col-i) >= 0; i++)
{
    if(board[row+i][col+i]) return true;
}

return false;

}
4

0 回答 0