C语言下的骑士棋解

C语言下的骑士棋解,c,solution,chess,C,Solution,Chess,我必须用C语言创建一个程序,在棋盘的每个可能的起点上检查国际象棋中骑士问题的解决方案。可悲的是,在写下它无法编译的所有内容后,在搜索了很长时间后,我没有找到任何解决方案 #include <stdio.h> void print(int **ruchytab,int size); void zewnetrzne(int size); int knight(int **ruchytab,int x,int y,int ktory,int size); int move(int **ru

我必须用C语言创建一个程序,在棋盘的每个可能的起点上检查国际象棋中骑士问题的解决方案。可悲的是,在写下它无法编译的所有内容后,在搜索了很长时间后,我没有找到任何解决方案

#include <stdio.h>
void print(int **ruchytab,int size);
void zewnetrzne(int size);
int knight(int **ruchytab,int x,int y,int ktory,int size);
int move(int **ruchytab,int x,int y,int wariant,int *newx,int *newy,int size);
int main()
{
    int size=5;
    zewnetrzne(size);
    return 0;
}
void print(int **ruchytab,int size)
{
    for(int i=0;i<size;i++)
    {
        for(int j=0;j<size;j++)
            printf("%2.d ",ruchytab[i][j]);
        putchar('\n');
    }
}
void zewnetrzne(int size)
{
    int ruchytab[size][size];
    for(int j=0;j<size;j++)          //cleaning tab
    {
        for(int i=0;i<size;i++)
            ruchytab[j][i]=0;
    }
    for(int a=0;a<size;a++)          //diffrent start points
        for(int b=0;b<size;b++)
        {
            knight(ruchytab,a,b,1,size);
            for(int j=0;j<size;j++)  //cleaning tab
            {
                for(int i=0;i<size;i++)
                    ruchytab[j][i]=0;
            }
        }
}
int knight(int **ruchytab,int x,int y,int ktory,int size)
{
    int newx,newy;
    ruchytab[x][y]=ktory;
    if(ktory>=size*size) //we have only n^2 possible moves ,we have to be everywhere only once
    {
        print(ruchytab,size);
        return 1;
    }
    else
    {
        for(int war=1;war<=8;war++)
            if(move(ruchytab,x,y,war,&newx,&newy,size)==1)
                if(knight(ruchytab,newx,newy,ktory+1,size)==1)
                    return 1;
    }
    return 0;
}
int move(int **ruchytab,int x,int y,int wariant,int *newx,int *newy,int size)
{
    switch(wariant)         //8 diffrent moves
    {
        case 1:
            *newx=x-1;
            *newy=y-2;
            break;
        case 2:
            *newx=x+1;
            *newy=y-2;
            break;
        case 3:
            *newx=x+2;
            *newy=y-1;
            break;
        case 4:
            *newx=x+2;
            *newy=y+1;
            break;
        case 5:
            *newx=x+1;
            *newy=y+2;
            break;
        case 6:
            *newx=x-1;
            *newy=y+2;
            break;
        case 7:
            *newx=x-2;
            *newy=y+1;
            break;
        case 8:
            *newx=x-2;
            *newy=y-1;
            break;
    }
    if(*newx>=0 && *newx <size && *newy>=0 && *newy<size && ruchytab[*newx][*newy]==0) //checking if the move is possible and if the place was visited already
        return 1;
    else
        return 0;
}

几年前的家庭作业是一样的:我现在还留着它

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ROWS 8
#define COLS 8
#define NUMBER_OF_QUEEN 8

typedef struct
{
    int col;
    int row;
} queen_t;

void getAllPossibleQueenLand(queen_t queens[] , int*count);
int canPlaceQueen(queen_t queen1 , queen_t queen2);
int checkAllTheQueenTillNow(queen_t queens[] , int length);

void main()
{
    int count = 0;
    int numberOfIteration = 0;
    queen_t queens[NUMBER_OF_QUEEN];
    queens[0].col = 0;


    while(queens[0].col != COLS){
        getAllPossibleQueenLand(queens , &count , &numberOfIteration);
    }

    printf("number of iteration is : %d \n" , count);

    system("pause");

}

void getAllPossibleQueenLand(queen_t queens[] , int *count , int    *numberOfIteration)
{
    if(queens[(*numberOfIteration)].row != (*numberOfIteration))
    {
        queens[(*numberOfIteration)].row = (*numberOfIteration);
        queens[(*numberOfIteration)].col = 0;
    }

if(queens[0].col == COLS)
{
    return;
}

else if(queens[(*numberOfIteration)].col == COLS)
{
    queens[(*numberOfIteration)].col = 0;
    queens[(*numberOfIteration) - 1].col++;
    (*numberOfIteration)--;
    getAllPossibleQueenLand(queens , count , numberOfIteration);
    return;
}

else if(checkAllTheQueenTillNow(queens , (*numberOfIteration) + 1) == 0 )
{
    queens[(*numberOfIteration)].col++;
    getAllPossibleQueenLand(queens , count , numberOfIteration);
    return;
}
else if( (*numberOfIteration) != NUMBER_OF_QUEEN - 1)
{
    (*numberOfIteration)++;
    getAllPossibleQueenLand(queens , count , numberOfIteration);
}
else{
    //found another possible place .. did the bonuse!!
    (*count)++;
    queens[(*numberOfIteration)].col = 0;
    queens[(*numberOfIteration)-1].col++;
    (*numberOfIteration)--;
}
}

}


}

您无法通过阵列:

int ruchytab[size][size];
指向接受int**指针的函数。N维数组在内部表示为指向大小*大小整数的顺序内存块的指针,类似于一维数组

为了使代码正常工作,您需要更改函数签名以接受int*,并将二维数组访问线性化,如下所示:

void print(int *ruchytab,int size) {
   ...
   ruchytab[i*size + j];
}

如果您想保持[][]语法,有一些方法可以实现,您可以阅读相关问题中的方法。

错误信息是什么?如果您在我的解决方案中发现错误,那将非常棒,我想知道我做错了什么。但无论如何,谢谢你。遗憾的是,相关问题似乎给出了大部分与骑士问题相关的问题。也许你可以链接其中的一个或两个?我认为二维数组类似于一维数组,所以该数组的每个索引都是指向变量的指针,但在我的例子中,指针指向一维数组。可悲的是,我是一个新的编程和你的回答没有明确:/如果链接到正确的网站,这将是可怕的!!!不管怎样,泰迪!编辑所以我必须使用malloc函数?
int ruchytab[size][size];
void print(int *ruchytab,int size) {
   ...
   ruchytab[i*size + j];
}