【问题标题】:KTouring Recursive CodeKTouring 递归代码
【发布时间】:2013-12-18 17:04:55
【问题描述】:

我似乎无法找到为什么输出中还剩下一些 -1。我应该实施什么以使其占据所有空间。我仔细检查了流程,但我认为问题出在我用位置(0,0)调用main中的函数时。但是如果位置 (0,0) 上没有解决方案,递归函数本身不会找到替代解决方案吗? 帮助表示赞赏。

#define N 8
#include<stdio.h>
#include<stdlib.h>

int xMove[8] = {1,1,-1,-1,2,2,-2,-2};
int yMove[8] = {2,-2,2,-2,1,-1,1,-1};

int isSafe(int x, int y, int board[N][N])
{
     if(x >= 0 && x < N && y >= 0 && y < N && board[x][y] == -1)
         return 1;
     else
         return 0;
}

int SolveKT(int x, int y, int imove, int board[N][N])
{
    int next_x, next_y, i;

    if(imove == N * N)
        return 1;

    for(i = 0;i < N; i++)
    {
        next_x = x+xMove[i];
        next_y = y+yMove[i];

        if(isSafe(next_x,next_y,board))
        {
             board[next_x][next_y]=imove;

             if(SolveKT(next_x,next_y,++imove,board))
                 return 1;
             else
                 board[next_x][next_y]=-1;      
        }//close if
    }//close for

    return 0;
}//close SolveKT

int main()
{
    int i,j,res,cboard[N][N]={[0 ... N-1][0 ... N-1]=-1};
    res = SolveKT(0,0,0,cboard);

    if(res)
    { 
        for(i=0;i<N;i++)
        {
            for(j=0;j<N;j++)
                printf("%d ",cboard[i][j]);
            printf("\n");
        }
    }

    return 0;
}//close main

【问题讨论】:

  • 这是什么:[0 ... N-1][0 ... N-1]=-1?是 C 吗?
  • 我认为 OP 只是使用它来使 SO 用户更清楚地进行初始化。 IMO memset() 会更合适....
  • 这是一个相当繁重的处理。
  • 应该是if(SolveKT(next_x,next_y,1+imove,board))

标签: c recursion chess


【解决方案1】:

您应该使用imove+1,而不是使用++imove,因为您不应该更改函数中的变量imove

但是,这个算法非常非常慢,你应该重新考虑一下。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 2018-02-11
    • 1970-01-01
    • 2016-09-22
    相关资源
    最近更新 更多