C语言下的骑士棋解
我必须用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
#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];
}