首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >骑士运动...“如何输出所有可能的动作。”

骑士运动...“如何输出所有可能的动作。”
EN

Stack Overflow用户
提问于 2010-04-04 10:56:16
回答 3查看 4.3K关注 0票数 2

下面是我写的代码。我必须为nXn编写它,但为了简单起见,我尝试为5X5测试它。它不显示我的输出...有人能告诉我下面的代码有什么问题吗?

代码语言:javascript
复制
{ 
#include <iostream>
#include <iomanip>

using namespace std;

void knight ( int startx, int starty, int n, int p[][5], int used [][5], int &count);

int main ( )
{
    const int n = 5; // no. of cloumns and rows
    int startx = 0;
    int starty = 0;
    int p[5][5];
    int used[5][5];
    int count = 1;

    int i= 0;
    int j = 0;

    //initializing the array
    for ( i = 0; i < 5; i++)
    {
        for ( j = 0; j < 5; j++)
        {
            p[i][j] = 0;
            used [i][j] = 0;
        }
    }

    //outputting the initialized array.. 
        i=0;
        while ( i< 5)
        {
            for ( j = 0; j < 5; j++)
            {
                cout << setw(3) << p[i][j];             
            }
            i++;
            cout << endl;
        }
        knight (startx,starty,n,p,used,count);

    return 0;
}

void knight ( int x, int y, int n, int p[][5], int used [][5], int &count)
{

        int i = 0;

    //knight (x,y,n,p,used,count)
    for ( i = 0; i < n*n; i++)
    {
        if ( used [x][y] == 0 )
        {
            used[x][y] = 1; // mark it used;
            p[x][y] += count; //inserting step no. into the solution

            //go for the next possible steps;

            //move 1
            //2 squares up and 1 to the left
            if (x-1 < 0 && y+2 < n && p[x-1][y+2] == 0)
            {   
                used[x-1][y+2] = 1;
                p[x-1][y+2] += count;
                knight (x-1,y+2,n,p,used,count);
                used[x-1][y+2] = 0;
            }

            //move 2
            //2 squares up and 1 to the right
            if ( x+1 < n && y+2 < n && p[x+1][y+2] == 0 )
            {
                used[x+1][y+2] = 1;
                p[x+1][y+2] += count;
                knight (x+1,y+2,n,p,used,count);
                used[x+1][y+2] = 0;
            }

            //move 3
            //1 square up and 2 to the right
            if ( x+2 < n && y+1 < n && p[x+2][y+1] == 0 )
            {
                used[x+2][y+1] = 1;
                p[x+2][y+1] += count;
                knight (x+2,y+1,n,p,used,count);
                used[x+2][y+1] = 0;
            }

            //move 4
            //1 square down and 2 to the right
            if ( x+2 < n && y-1 < n && p[x+2][y-1] == 0 )
            {
                used[x+2][y-1] = 1;
                p[x+2][y-1] += count;
                knight (x+2,y-1,n,p,used,count);
                used[x+2][y-1] = 0;
            }

            //move 5
            //2 squares down and 1 to the right
            if ( x+1 < n && y-2 < n && p[x+1][y-2] == 0 )
            {
                used[x+1][y-2] = 1;
                p[x+1][y-2] += count;
                knight (x+1,y-2,n,p,used,count);
                used[x+1][y-2] = 0;
            }

            //move 6
            //2 squares down and 1 to the left
            if ( x-1 < n && y-2 < n && p[x-1][y-2] == 0 )
            {
                used[x-1][y-2] = 1;
                p[x-1][y-2] += count;
                knight (x-1,y-2,n,p,used,count);
                used[x-1][y-2] = 0;
            }

            //move 7
            //1 square down and 2 to the left
            if ( x-2 < n && y-1 < n && p[x-2][y-1] == 0 )
            {
                used[x-2][y-1] = 1;
                p[x-2][y-1] += count;
                knight (x-2,y-1,n,p,used,count);
                used[x-2][y-1] = 0;
            }

            //move 8
            //one square up and 2 to the left
            if ( x-2 < n && y+1< n && p[x-2][y+1] == 0 )
            {
                used[x-2][y+1] = 1;
                p[x-2][y+1] += count;
                knight (x-2,y+1,n,p,used,count);
                used[x-2][y+1] = 0;
            }
        }
    }

    if ( x == n-1 && y == n-1)
    {
        while ( i != n)
        {
            for ( int j = 0; j < n; j++)
                cout << setw(3) << p[i][j];
            i++;
        }
    }
}

谢谢你!!

EN

回答 3

Stack Overflow用户

发布于 2010-04-04 11:14:35

首先,一些编译器很挑剔,如果你的函数声明和定义中的变量名不同,它们会给你一个警告。

代码语言:javascript
复制
void knight ( int startx, int starty, int n, int p[][5], int used [][5], int &count);
[...]
void knight ( int x, int y, int n, int p[][5], int used [][5], int &count) { ... }

其次,如果您试图将int指针传递给knight (参数为count),那么您将使用int *count。如果要在knight中使用递归,最好将count声明为全局变量,或者(如下所示)如果count参数仅对特定调用树有效,则您可能不希望使用指针,而只是为每个调用提供自己的count

第三,文件顶部的恶意{是什么?你是故意把它放在那儿的吗?

当你运行这个程序时,它会做什么呢?您是否尝试过在代码的不同部分插入打印输出的调试消息,以便查看错误或无限循环发生的位置?

票数 1
EN

Stack Overflow用户

发布于 2010-04-04 11:20:37

这些都是代码中不同问题的提示:

在执行if ( x == n-1 && y == n-1)的程序中,i有什么价值?它是如何获得这个值的?

这个循环for ( i = 0; i < n*n; i++)到底有什么作用?

当你有一个像y-2 < n这样的表达式时,这真的是你想要的吗?y-2永远不能小于n

票数 1
EN

Stack Overflow用户

发布于 2010-04-12 04:05:39

我使用以下代码得到了答案:

代码语言:javascript
复制
#include <iostream>
#include <iomanip>

using namespace std;

bool move(int *p[] ,int x, int y,int n);
void knights (int *p[],int x,int y,int n, int count, int &pmt);
void output(int *p[],int n);

int main(char argc, char *argv[])
{

    int count = 1;
    int pmt = 0;
    int n;  //for size of board
    int x,y; // starting pos
    int **p; // to hold no. of combinations

    if ( argc != 4)
    {
        cout << "Very few arguments. Please try again.";
        cout << endl;
            return 0;
    }

    n = atoi(argv[1]);
    if( argv[1] <= 0 )
    {
        cout << " Invalid board size. ";
        return 0;
    }

    x = atoi(argv[2]);
    y = atoi(argv[3]);

    cout << "board size: " << n << ", "<< n << endl;
    cout << "starting pos: " << x << ", " << y << endl;


    //dynamic allocation of arrays to hold permutation
    p = new int *[n];
    for (int i = 0; i < n; i++)
        p[i] = new int [n];    

    //initializing board
    int i, j;
    for (i=0; i<n; i++)
    {
        for (j=0; j<n; j++)
        {
            p[i][j] = 0;
        }
    }

    output(p,n); // check output format
    knights(p,x,y,n,count,pmt);
    cout << "no. perm " << pmt << endl;


    return 0;
}

void output(int *p[],int n)
{
    int i = 0;
    int j;

    while ( i != n)
    {
        for ( j=0; j<n; j++)
        {
            cout << setw(10) << p[i][j];
        }
        cout << endl;
        i++;
    }
}

bool move(int *p[],int x, int y,int n)
{

    if (x < 0 || x >= n)
    {
        return false;
    }
    if ( y < 0 || y >= n)
    {
        return false;
    }

    if( p[x][y] != 0 )
    {
        return false;
    }

    return true;
}

void knights (int *p[], int x,int y,int n ,int count , int &pmt)
{    
    if(!move(p,x,y,n))
    {
        return;
    }

    if (count == n*n)    
    {
        cout << "New solution found: " << endl <<endl;
        p[x][y]=count;
        output(p,n);
        p[x][y]= 0;
        pmt++;
    }

    if ( p[x][y] == 0 )
    {
        p[x][y] = count;

        //move 1
        knights (p,  x-1, y-2, n, count+1, pmt);

        //move 2
        knights (p,  x+1, y-2, n, count+1, pmt);

        //move 3
        knights (p,  x+2, y-1, n, count+1, pmt);

        //move 4
        knights (p,  x+2, y+1, n, count+1, pmt);

        //move 5
        knights (p,  x+1, y+2, n, count+1, pmt);

        //move 6
        knights (p,  x-1, y+2, n, count+1, pmt);

        //move 7
        knights (p,  x-2, y+1, n, count+1, pmt);

        //move 8
        knights (p,  x-2, y-1, n, count+1, pmt);

        p[x][y] = 0; //setting square back to zero
    }        
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2573404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档