为什么针对给定挑战的此解决方案不起作用?

时间:2018-06-11 17:09:31

标签: c++

国际象棋的尝试 - 回溯问题

你会得到一个10X10的棋盘,骑士坐在坐标上(I,J)。你必须在棋盘上找到骑士可以正好N次移动的棋盘数量。

输入
输入将由三个空格分隔的整数I,J,N组成。 N小于10。

输出
打印一个整数,表示骑士可以完全N移动的棋盘上的棋盘数。

我的解决方案:

#include <iostream>

using namespace std;

#define S 10

bool move_possible(int board[S][S], int x, int y,int i,int j) {
  if (((x - 2 == i || x + 2 == i) && (y - 1 == j || y + 1 == j)) ||
      ((x - 1 == i || x + 1 == i) && (y - 2 == j || y + 2 == j)) )
    return true;
  return false;
}


bool Knight_moves(int board[S][S], int x, int y, int n, int &b) {
  if (n > 0) {
    for (int i = 0; i < S; i++) {
      for (int j = 0; j < S; j++) {
        if (!move_possible(board, x, y, i, j)) continue;
        board[i][j]++;
        if (Knight_moves(board, i, j, n - 1, b)) return true; 
      }
    }
  }
  return false;
}

int main() {
  int board[S][S];

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

  int x, y, n, b;
  b = 0;
  cin >> x >> y >> n;
  Knight_moves(board, x - 1, y - 1, n, b);
  int moves = 0;
  for (int i = 0; i<S; i++) {
    for (int j = 0; j<S; j++) {
      moves += board[i][j];
    }
  }

  cout << moves;
  cin.get();
  cin.get();

  return 0;
}

此解决方案为某些输入提供了正确的输出,例如:

  • 输入:1 1 1,输出:2

  • 输入:3 3 1,输出:8

  • 输入:3 3 2,输出:50

但是解决方案为某些输入提供了错误的输出,例如:

  • 输入:4 7 6,我的输出:128382,正确输出:50

  • 输入:3 8 5,我的输出:14364,正确输出:50

2 个答案:

答案 0 :(得分:0)

这是您可以尝试的一种算法。

首先,创建10x10数组并将每个元素设置为-1。这标志着广场没有受到攻击。

接下来,获取输入并使用0标记起始位置。

现在,用1

标记骑士正在攻击的每个方格
.  1  .  1  .  .  .  .  .  .  
1  .  .  .  1  .  .  .  .  .  
.  .  X  .  .  .  .  .  .  .  
1  .  .  .  1  .  .  .  .  .  
.  1  .  1  .  .  .  .  .  .  
.  .  .  .  .  .  .  .  .  .  
.  .  .  .  .  .  .  .  .  .  
.  .  .  .  .  .  .  .  .  .  
.  .  .  .  .  .  .  .  .  .  
.  .  .  .  .  .  .  .  .  .  

(我已将-1替换为.,并以X开头以明确说明。 在这里,I = 3, J = 3, and N = 1。所以只需将N(其中有8个)加起来。

对于N > 1,请重复。每次迭代,检查板上的每个方块。如果它在上一次迭代中被标记,则标记它正在攻击的每个方格。

示例:3 3 2

.  .  2  .  .  .  2  .  .  .  
.  2  .  2  .  2  .  .  .  .  
2  .  2  .  2  .  2  .  .  .  
.  2  .  2  .  2  .  .  .  .  
.  .  2  .  .  .  2  .  .  .  
.  2  .  2  .  2  .  .  .  .  
2  .  2  .  2  .  .  .  .  .  
.  .  .  .  .  .  .  .  .  .  
.  .  .  .  .  .  .  .  .  .  
.  .  .  .  .  .  .  .  .  .  

1攻击的每个方格现在都标有2。其中有20个。重复。

3 3 3

.  3  .  3  .  3  .  3  .  .  
3  .  3  .  3  .  3  .  3  .  
.  3  .  3  .  3  .  3  .  .  
3  .  3  .  3  .  3  .  3  .  
.  3  .  3  .  3  .  3  .  .  
3  .  3  .  3  .  3  .  3  .  
.  3  .  3  .  3  .  3  .  .  
3  .  3  .  3  .  3  .  .  .  
.  3  .  3  .  3  .  .  .  .  
.  .  .  .  .  .  .  .  .  .  

2攻击的每个空间现在都标有3

答案 1 :(得分:0)

我的解决方案:

const firebaseConfig = {
      apiKey: 'Your Api key ',
      authDomain: 'your ap id .firebaseapp.com',
      databaseURL: 'https://auth-78930.firebaseio.com',
      projectId: 'xxxxx',
      storageBucket: 'xxxxxxx',
      messagingSenderId: 'xxxxxx',
      appId: '1:674783690996:web:7dde6f4aa97cd79a7c9ea1',
      measurementId: 'G-CWBS2XMR3F',
    };
    // Initialize Firebase
    try {
      firebase.initializeApp(firebaseConfig);
    } catch (e) {
      console.log(e);

      // firebase.analytics();
    }