Este é um problema N Rainhas, onde a placa foi dado e você deve usar métodos para verificar onde as linhas, as colunas e na diagonal. Meu método para verificar a linha está aqui: Ele funciona se você estivesse contando as Rainhas como um todo, mas eu só quero verificar linha por linha, redefinindo a contagem e número de linhas .
private boolean oneQueenPerRow() //ensures that there is only 1 queen in each row
{
int count = 0;
int rowcount = 0;
for (int i = 0; i < board.length; i++)
{
//count = 0;
for (int j = 0; j < board.length; j++)
{
//rowcount = 0;
while (rowcount <= size-1)
{
if (board[i][j] == QUEEN)
{
count++;
rowcount++;
}
if (board[i][j] == BLANK)
{
rowcount++;
}
}
if (count != 1) // if size replaces 1 then it works, but counts Q's as a whole
{
return false;
}
}
}
return true;
}
A idéia é que todos os métodos retornam verdadeiro ou falso e, em seguida, são chamados pelo método booleano final. Se todas são verdadeiras do que a placa é uma solução válida. Se um é falsa, o conselho não é uma solução válida. Aqui está um exemplo de arquivo de texto me foi dada:
4 BQBB BBBQ QBBB BBQB
(Devem ser empilhados ..)
Eu não tenho conhecimento suficiente sobre matrizes e loops para dizer se isso vai todo o caminho até o arquivo inteiro ou apenas uma linha de cada vez, embora confie em mim quando eu digo que esgotaram todos os recursos.
Tenho vindo a trabalhar sobre isso por dias e eu não posso descobrir isso e conexão com a minha Prof é irregular por causa deste vírus! Eu preciso desesperadamente de ajuda!
private boolean noDiagonalAttacks() //makes sure that Queens cannot attack diagonally
{
for (int i = 0; i < board.length; i++)
{
int count = 0;
for (int j = 0; j < board.length; j++)
{
if (board[i][j] == QUEEN)
{
if(this.toRight() == false || this.toLeft() == false)
{
return false;
}
count++;
}
}
}
return true;
}
private boolean toRight()
{
for (int i = 0; i < board.length; i++)
{
for (int j = 0; j < board.length; j++)
{
while (board[i][j] != board[i][size-1] || board[i][j] != board[size-1][j]) //add a count to this?
{
if (board[i][j] == QUEEN)
{
return false;
}
}
}
}
return true;
}
private boolean toLeft()
{
for (int i = 0; i < board.length; i++)
{
for (int j = 0; j < board.length; j++)
{
while (board[i][j] != board[i][0] || board[i][j] != board[size-1][j])
{
if (board[i][j] == QUEEN)
{
return false;
}
}
}
}
return true;
}
Eu tentei uma vez atrás e funcionou, espero que ajudá-lo.
private boolean oneQueenPerRow() {
int foundQueens;
for (int i = 0; i < board.length; i++) {
foundQueens = 0;//each loop is a checked row
for (int j = 0; j < board.length; j++) {
if (board[i][j] == QUEEN)
foundQueens++;
}
if (foundQueens > 1) return false;
}
return true;
}