java - 如何在 2D 字符数组中检查特定元素的行,然后计算该行中有多少元素?(爪哇)
问题描述
这是一个 N Queens 问题,其中已经给出了棋盘,您必须使用方法检查行、列和对角线的位置。我检查行的方法在这里:如果您将皇后区作为一个整体进行计数,但我只想逐行检查,重置 count 和 rowcount。
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;
}
这个想法是所有方法都返回真或假,然后由最终布尔方法调用。如果一切都是真的,那么董事会就是一个有效的解决方案。如果其中一个为假,则该板不是有效的解决方案。这是我得到的一个文本文件示例:
4 BQBB BBBQ QBBB BBQB
(它们应该堆叠..)
我没有足够的关于数组和 for 循环的知识来判断这是一直遍历整个文件还是一次仅一行,尽管当我说我已经用尽所有资源时请相信我。
我已经为此工作了好几天,但由于这种病毒,我无法弄清楚,并且与我的教授的联系参差不齐!我迫切需要帮助!
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;
}
解决方案
我之前试过一次,效果很好,希望对你有帮助。
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;
}
private boolean oneQueenPerDiagonal() {
int inLeftRight = 0;
int inRightLeft = 0;
for (int i = 0; i < board.length; i++) {
if (board[i][i] == QUEEN)
inLeftRight++;
if (board[i][board.length-i-1] == QUEEN)
inRightLeft++;
}
return inLeftRight < 1 && inRightLeft < 1;
}
推荐阅读
- powerbi - 是否可以在计算列中提供 USERPRINCIPALNAME?
- java - 让构造函数工作初始变量
- java - 在 Spring Batch 中自定义作业 ID
- java - 如何从 Docker 上的 Spring 应用程序访问 Docker 上的 MySQL 数据库?
- wordpress - Wordpress is_user_logged_in && is_page 不工作
- java - application.yml 中正确的 Springboot -Kafka 参数是什么?
- c# - 通过 C# 更新 JIRA 问题状态时面临“401:未授权”问题
- python - 用于创建保存和加载数据框的 Python 函数
- python - 如何在qml的ListView中显示列表中的项目
- javascript - 如何使用 ajax 在 django formset 中显示错误消息