为什么Nqueens中两个代码的输出都不同

问题描述 投票:0回答:1

我对此代码有问题,当我使用true-false语句时,我得到的输出是不同的;当我使用0-1而不是true-false时,我得到的答案是不同的。但是两个答案只有在可能性不同的情况下才是正确的。

在isattacken函数中使用true-false语句

import java.util.*;
import java.io.*;

class Main
{
  public static int n;
  public static int[][] board = new int[100][100];
  public static boolean isattacken (int i, int j)
  {
    int k, l;
    for (k = 0; k < n; k++)
      {
    if ((board[i][k] == 1) || (board[k][j] == 1))
      return true;
      }
    for (k = 0; k < n; k++)
      {
    for (l = 0; l < n; l++)
      {
        if (((k + l) == (i + j)) || ((k - l) == (i - j)))
          {
        if (board[k][l] == 1)
          return true;
          }
      }
      }
    return false;
  }

  public static int nqueen (int no)
  {
    if (no == 0)
      return 1;
    for (int i = 0; i < n; i++)
      {
    for (int j = 0; j < n; j++)
     { if (!(isattacken (i, j)) && (board[i][j] != 1))
        { 
          board[i][j] = 1;
          if (nqueen (no - 1) == 1)
        {
          return 1;
        }
          board[i][j] = 0;
        }
      }
  }
  return 0;
}

public static void main (String[]args)
{
  Scanner s = new Scanner (System.in);
  System.out.println ("Enter n");
  n = s.nextInt ();
  nqueen (n);
  for (int i = 0; i < n; i++)
    {
      for (int j = 0; j < n; j++)
    {
        System.out.print (board[i][j] + "\t");
    }System.out.println();
    }
}
}

在isattacken函数中使用0和1

import java.util.*;
import java.io.*;

class Main
{
  public static int n;
  public static int[][] board = new int[100][100];
  public static int isattacken (int i, int j)
  {
    int k, l;
    for (k = 0; k < n; k++)
      {
    if ((board[i][k] == 1) || (board[k][j] == 1))
      return 1;
      }
    for (k = 0; k < n; k++)
      {
    for (l = 0; l < n; l++)
      {
        if (((k + l) == (i + j)) || ((k - l) == (i - j)))
          {
        if (board[k][l] == 1)
          return 1;
          }
      }
      }
    return 0;
  }

  public static int nqueen (int no)
  {
    if (no == 0)
      return 1;
    for (int i = 0; i < no; i++)
      {
    for (int j = 0; j < n; j++)
      {
        if ((isattacken (i, j))!=1 && (board[i][j] != 1))
          {
            board[i][j] = 1;
            if (nqueen (no - 1) == 1)
              {
                return 1;
              }
            board[i][j] = 0;
          }
      }
      }
  return 0;
}

public static void main (String[] args)
{
  Scanner s = new Scanner (System.in);
  System.out.println ("Enter n");
  n = s.nextInt ();
  nqueen(n);
  for (int i = 0; i < n; i++)
    {
      for (int j = 0; j < n; j++)
    {
      System.out.print (board[i][j] + "\t");
    }System.out.println();
    }

}
}

根据两者,代码输出应该相同,但是输出却不同。

java recursion backtracking n-queens
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.