【问题标题】:Knight Chess solution in CC语言中的Knight Chess解决方案
【发布时间】:2015-11-21 17:49:59
【问题描述】:

我必须用 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;
}

【问题讨论】:

  • 错误信息是什么?

标签: c solution chess


【解决方案1】:

只是复制并过去几年前的相同作业:) 我仍然拥有它

#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 checkAllTheQueenTillNow(queen_t queens[] , int length)
{
int i;
for(i = 0 ; i < length - 1 ; i++)
{

    if(canPlaceQueen(queens[i] , queens[length-1]) == 0)
    {
        return 0;
    }

}

return 1;

}

  int canPlaceQueen(queen_t queen1 , queen_t queen2)
{
    int i;
    for(i = 0 ; queen1.col - i > 0 || queen1.col + i < COLS || queen1.row - i > 0 || queen1.row + i < ROWS ; i++)
{
    if(((queen1.row + i == queen2.row) &&(queen1.col == queen2.col))     ||
       ((queen1.row - i == queen2.row) &&(queen1.col == queen2.col))     ||
       ((queen1.row == queen2.row) &&(queen1.col + i == queen2.col))     ||
       ((queen1.row == queen2.row) &&(queen1.col - i == queen2.col))     ||
       ((queen1.row + i == queen2.row) &&(queen1.col + i == queen2.col)) ||
       ((queen1.row + i == queen2.row) &&(queen1.col - i == queen2.col)) ||
       ((queen1.row - i == queen2.row) &&(queen1.col + i == queen2.col)) ||
       ((queen1.row - i == queen2.row) &&(queen1.col - i == queen2.col)))
    {
        return 0;
    }

}

return 1;

}

【讨论】:

  • 如果你在我的解决方案中发现错误会很棒,我想知道我做错了什么。不过还是谢谢你。
【解决方案2】:

你不能传递数组:

int ruchytab[size][size];

到接受int** 指针的函数。 N 维数组在内部表示为指向size * size 整数的顺序内存块的指针(类似于一维数组)。

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

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

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

【讨论】:

  • 遗憾的是,相关问题似乎大多是与骑士问题相关的问题。也许您可以链接其中的一两个?
  • 我认为二维数组就像一维数组,所以该数组的每个索引都是指向值的指针,但在我的情况下,指针指向一维数组的指针。可悲的是,我对编程有点陌生,你的回答没有说​​清楚:/如果链接正确的网站,那将是太棒了!无论如何,泰!编辑。所以我必须使用 malloc 函数?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-13
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多