gpt4 book ai didi

c - 8 皇后片段

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:35:57 26 4
gpt4 key购买 nike

我目前正在学习回溯并陷入了 8 皇后问题,我正在使用 8x8 矩阵,我认为我在矩阵传递给函数方面遇到了一些问题,任何帮助都会受到高度赞赏。我不会'不介意是否有人会对代码进行任何优化,谢谢。

这是我的代码。

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

#define MAX 7



//void azzera(int **mat);
void posiziona(int **mat, int r,int c);
void stampa(int **mat);
int in_scacchi(int **mat,int r ,int c);

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



int i=0,j=0;


int **mat=(int **)malloc(sizeof(int *)*MAX);
for(i=0;i<=MAX;i++){
mat[i]=(int *)malloc(MAX*sizeof(int));
for(j=0;j<=MAX;j++){

mat[i][j]=-1;
}
}


printf("insert pos of the first queen on the first row (1-8) :");
scanf("%d",&i);
i-=1;
mat[0][i]=1;

posiziona(mat,1,0);
stampa(mat);

system("PAUSE");
return 0;
}

/*void azzera(int **mat){

int i=0,j=0;

for(i=0;i<=MAX;i++){
for(j=0;j<=MAX;j++){
mat[i][j]=-1;
}
}

}*/

void stampa(int **mat){
int i,j;

for(i=0;i<=MAX;i++){
for(j=0;j<=MAX;j++){
printf(" %d",mat[i][j]);
}
printf("\n");
}

}
void posiziona(int **mat, int r,int c){
int i=0,riga=1,flag_col=-1,flag_riga=-1;

if(riga<=7&&flag_riga!=1){

if(flag_riga==1){
flag_riga=-1;
posiziona(mat,r+1,0);
}
else if(in_scacchi(mat,r,c)==1){
if(c==MAX)
posiziona(mat,r-1,0);
posiziona(mat,r,c+1);
}
else{
flag_riga=1;
}
}
}

int in_scacchi(int **mat,int r ,int c){
int i,j,k,m;
int flag=0;
//col
for(i=0;i<r;i++){
for(j=0;j<=c;j++){
if(((mat[i][j]==1)&&(c==j)))
return 1;

}
}
//diag \
for(i=0;i<MAX-r;i++){
for(j=0;j<=MAX-c;j++){
if(mat[MAX-r-i][MAX-c-j]==1)
return 1;
}
}

//antidiag

for(i=r+1;i<=MAX;i++){
for(j=c+1;j<=MAX;j++){
if(mat[r-i][c+j]==1) {
return 1;
}
}
}
return 0;

}

最佳答案

1.一个明显的问题是内存分配:

  int **mat=(int **)malloc(sizeof(int *)*MAX);
for(i=0;i<=MAX;i++){
mat[i]=(int *)malloc(MAX*sizeof(int));

鉴于 MAX 是 7,两个 mallocs 都为矩阵分配了太少的内存(七个元素而不是八个)。

老实说,我会将 MAX 重命名为 SIZE 或类似名称,并将所有循环更改为使用严格小于,即

for(i = 0; i < SIZE; i++) {

我认为这更符合习惯并且不太容易出错。

2. 我没有尝试调试逻辑(我认为期望我们这样做是不公平的)。但是,我注意到除了 main 之外,您没有为 mat 的元素赋值。对我来说,这表明代码不可能是正确的。

3. 除此之外,观察到在一个有效的解决方案中,棋盘的每一行都恰好包含一个皇后可能会很有用。这意味着您实际上不需要 8x8 矩阵来表示解决方案:列位置的 8 元素数组就可以了。

编辑 针对您在评论中提出的问题,这里有一个完整的 Python 实现,演示了上面的第 3 点:

def can_place(col_positions, col):
row = len(col_positions)
for r, c in enumerate(col_positions):
if c == col or abs(c - col) == abs(r - row): return False
return True

def queens(n, col_positions = []):
if len(col_positions) >= n:
pretty_print(n, col_positions)
return True
for col in xrange(n):
if can_place(col_positions, col):
if queens(n, col_positions + [col]):
return True
return False

def pretty_print(n, col_positions):
for col in col_positions:
print '.' * col + 'X' + '.' * (n - 1 - col)

queens(8)

关于c - 8 皇后片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7310227/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com