微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用回溯的骑士​​之旅中的问题

如何解决使用回溯的骑士​​之旅中的问题

当我尝试使用Backtracking运行Knights Tour问题的解决方案时,我陷入无限循环

我的解决方代码链接https://ideone.com/Ud92vF 代码

#include <bits/stdc++.h> 
using namespace std;
bool valid(int arr[8][8],int r,int c)
{
    if(r>=0 and r<8 and c>=0 and c<8 and arr[r][c]== -1)
        return true;
    return false;
}
void fun(int arr[8][8],int c,int x)
{
    if(x==64){
    cout<<"***********************ARRAY FOUND***********************\n";
    for(int i=0;i<8;i++){
        for(int j=0;j<8;j++)
            cout<<arr[i][j]<<" ";
        cout<<"\n";
        }
        return;
    }
    if(!valid(arr,r,c))
    return;
    arr[r][c] = x;
    fun(arr,r-2,c+1,x+1); fun(arr,c-1,x+1);
    fun(arr,c+2,c-2,r+2,r+1,x+1);
    arr[r][c] = -1;
} 

int main() 
{
    int arr[8][8] ;
    for(int i=0;i<8;i++){
        for(int j=0;j<8;j++)
            arr[i][j] = -1;
    }
    int r=0,c=0,x=0; fun(arr,c,x);
} 

解决方法

确保您的移动数组正确:

SELECT seller,o.order_id,COUNT(DISTINCT o.order_id) AS approved
  FROM records r,orders o
 WHERE l.order_id IN (
SELECT order_id
    FROM records
    WHERE record_log = 'approved')
 GROUP 
    BY merchant_name
;

有了这个,我得到了正确的答案:

fun(arr,r-2,c-1,x+1); fun(arr,c+1,x+1);
fun(arr,r-1,c-2,c+2,r+1,r+2,x+1);

请注意,当您使用第65步验证您的答案时,您将连续获得8个相同的正确答案。然后再添加8.等。您可以在第64步之后通过打印来解决此问题:

***********************ARRAY FOUND***********************
0 11 8 5 2 13 16 19
9 6 1 12 17 20 3 14
30 27 10 7 4 15 18 21
63 24 31 28 35 22 47 44
32 29 26 23 48 45 36 57
25 62 51 34 39 56 43 46
52 33 60 49 54 41 58 37
61 50 53 40 59 38 55 42

最后一个问题是,您只能从{0,0}开始,因此您只会找到从那个广场开始的骑士之旅。您真的想从每个广场开始寻找所有可能的骑士之旅。或者,如果您感觉很聪明,则只需检查起始正方形的一个子集,然后使用对称性生成其他正方形。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。