我已经实现了n-queens问题。但是,与在线解决方案相比,我有更多的组合而不是实际答案。
以下是我的代码
public class Queens
{
static int rows = 5;
static int cols = 5;
public static void main(String[] args)
{
int[] column = {-1,-1,-1,-1,-1};
fun(0, column);
}
/* j is basically each column */
static void fun(int j, int[] column)
{
if(j == cols)
{
System.out.print("success : ");
for(int k = 0;k<column.length;k++)
{
System.out.print(column[k]);
}
System.out.println("");
return;
}
/* Each column could have the queen in any of the rows */
for(int i = 0;i <rows ;i++)
{
if(isValid(column,j,i) == 1)
{
int[] temp = new int[rows];
for(int k = 0;k<column.length;k++)
temp[k] = column[k];
column[j] = i;
fun(j+1,column);
for(int k = 0;k<temp.length;k++)
column[k] = temp[k];
}
}
}
static int isValid(int[] a, int row, int check)
{
int lastindex = 0;
/* check if they're in the same row */
for(int i = 0;i<a.length;i++)
{
if(a[i] == -1)
{
lastindex = i-1;
break;
}
if(a[i] == check)
return 0;
}
/* check if they're in the same diagonal */
if(lastindex >= 0)
{
/* diagonal on the rise */ /* falling diagonal */
if( (a[lastindex] == check-1) || (a[lastindex] == check+1) )
return 0;
}
/* Note : It can't be in the same column since you're selecting only one for each column, the for loop */
return 1;
}
}
这是我对5皇后问题的输出。 (在代码中,您可以通过相应地更改行和列的值并更改数组来获取任何n)
success : 13524
success : 14253
success : 24135
success : 24153 -
success : 25314
success : 31425
success : 31524 -
success : 35142 -
success : 35241
success : 41352
success : 42513 -
success : 42531
success : 52413
success : 53142
然而,在online site我用来比较输出
时,最后标有连字符的连字符丢失了请告诉我这四种情况的原因。 (对于8-queen,上面的代码在输出中给出了5242个组合,当然我在isValid函数中做错了)
编辑:非常感谢vish4071,我现在更改了isValid()函数并获得了正确的输出;我不知道每一步都必须检查对角线。代码
public class Queens
{
static int rows = 8;
static int cols = 8;
public static void main(String[] args)
{
int[] column = {-1,-1,-1,-1,-1,-1,-1,-1};
fun(0, column);
}
/* j is basically each column */
static void fun(int j, int[] column)
{
if(j == cols)
{
System.out.print("success : ");
for(int k = 0;k<column.length;k++)
{
System.out.print(column[k]);
}
System.out.println("");
return;
}
/* Each column could have the queen in any of the rows */
for(int i = 0;i <rows ;i++)
{
if(isValid(column,j,i) == 1)
{
int[] temp = new int[rows];
for(int k = 0;k<column.length;k++)
temp[k] = column[k];
column[j] = i;
fun(j+1,column);
for(int k = 0;k<temp.length;k++)
column[k] = temp[k];
}
}
}
static int isValid(int[] a, int col, int check)
{
for(int i = 0;i<a.length;i++)
{
if(a[i] == -1)
break;
/* check if they're in the same row */
if(check == a[i])
return 0;
/* check if they're in the same diagonal */
if( Math.abs(check-a[i]) == (col-i) )
return 0;
}
/* Note : It can't be in the same column since you're selecting only one for each column, the for loop */
return 1;
}
}
答案 0 :(得分:2)
您检查对角线是错误的。不要使用lastindex
。检查same diagonal
a
中-1
的所有值24153
是否a
。
我解释使用你的一个输出(你把连字符反对)作为例子。让我们[2,4,1,-1,-1]
。
假设您的3
现在是1
,即。你现在要填写索引not being in the same diagonal
。您的最后一个索引将是0
,并且在矩阵中,(2,1)和(3,5)不在同一对角线中。因此,它接受第4个值为5 2
,而它与您在索引chrome.webRequest.onHeadersReceived.addListener(function(details){
if(isPDF(details))
{
chrome.tabs.executeScript(details.tabId, {file: "content.js", runAt: "document_end"}, function(result){
if(chrome.runtime.lastError)
{
console.log(chrome.runtime.lastError.message);
}
});
return {
responseHeaders: [{
name: 'X-Content-Type-Options',
value: 'nosniff'
}, {
name: 'X-Frame-Options',
value: 'deny'
}]
};
}
}, {
urls: ['*://*/*'],
types: ['main_frame']
}, ['blocking', 'responseHeaders']);
处的值处于同一对角线,即。 content.js
,因为(0,2)和(3,5)位于相同的对角线上。因此,请检查所有值。
答案 1 :(得分:-1)
在 5242 组合上的答案通常应该是 92 时,问题只是检查彼此相邻的一对坐标,而不检查彼此不相邻的坐标