我的 n 皇后拼图代码有什么错误?
What is the error in my code for the n queen puzzle?
#include <stdio.h>
#include <math.h>
char a[10][10];
int n;
int feasible(int row,int col)
{
int i,j,tcol;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(a[i][j]=='Q')
break;
}
tcol=j;
if(col==tcol || abs(row-i)==abs(col-tcol))
return 0;
}
return 1;
}
void nqueen(int row)
{
int i,j;
if(row<n)
{
for(i=0;i<n;i++)
{
if(feasible(row,i))
{
a[row][i]='Q';
nqueen(row+1);
a[row][i]='.';
}
}
}
else
{
printf("\nThe solution is:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%c\t",a[i][j]);
}
printf("\n\n");
}
}
}
int main()
{
int i,j;
printf("Enter the number of queens:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
a[i][j]='.';
}
}
nqueen(0);
getch();
return 0;
}
可行的功能是检查传递的行&列中是否可以放置皇后
函数nqueen
给出了问题的所有可能解法。
我没有在屏幕上得到任何输出。请帮忙!
当你检查你的棋盘的可行性时,你应该只检查你已经放置皇后的行:
int feasible(int row, int col)
{
int i, j, tcol;
for (i = 0; i < row; i++) {
for (j = 0; j < n; j++) {
if (a[i][j] == 'Q') break;
}
tcol = j;
if (col==tcol || abs(row - i) == abs(col - tcol))
return 0;
}
return 1;
}
对于 i
和 i < row
的每一行,都有一个皇后。所有其他行还没有皇后,并且 tcol
等于 n
,它脱离循环时的值。我想有时对角线检查会意外地为真,从而缩短了完全有效的皇后放置。
您可以检查三个路径 - 直线向上、左对角线 (l
) 和所有行的右对角线 (r
),而不是在每一行中找到皇后:
int feasible(int row, int col)
{
int l = col;
int r = col;
while (row--) {
l--; r++;
if (a[row][col] == 'Q') return 0;
if (l >= 0 && a[row][l] == 'Q') return 0;
if (r < n && a[row][r] == 'Q') return 0;
}
return 1;
}
另一种表示棋盘的方法是为每个文件保留皇后的排名,这样您就不必搜索了。不过,这会使电路板的打印稍微复杂一些。
#include <stdio.h>
#include <math.h>
char a[10][10];
int n;
int feasible(int row,int col)
{
int i,j,tcol;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(a[i][j]=='Q')
break;
}
tcol=j;
if(col==tcol || abs(row-i)==abs(col-tcol))
return 0;
}
return 1;
}
void nqueen(int row)
{
int i,j;
if(row<n)
{
for(i=0;i<n;i++)
{
if(feasible(row,i))
{
a[row][i]='Q';
nqueen(row+1);
a[row][i]='.';
}
}
}
else
{
printf("\nThe solution is:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%c\t",a[i][j]);
}
printf("\n\n");
}
}
}
int main()
{
int i,j;
printf("Enter the number of queens:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
a[i][j]='.';
}
}
nqueen(0);
getch();
return 0;
}
可行的功能是检查传递的行&列中是否可以放置皇后
函数nqueen
给出了问题的所有可能解法。
我没有在屏幕上得到任何输出。请帮忙!
当你检查你的棋盘的可行性时,你应该只检查你已经放置皇后的行:
int feasible(int row, int col)
{
int i, j, tcol;
for (i = 0; i < row; i++) {
for (j = 0; j < n; j++) {
if (a[i][j] == 'Q') break;
}
tcol = j;
if (col==tcol || abs(row - i) == abs(col - tcol))
return 0;
}
return 1;
}
对于 i
和 i < row
的每一行,都有一个皇后。所有其他行还没有皇后,并且 tcol
等于 n
,它脱离循环时的值。我想有时对角线检查会意外地为真,从而缩短了完全有效的皇后放置。
您可以检查三个路径 - 直线向上、左对角线 (l
) 和所有行的右对角线 (r
),而不是在每一行中找到皇后:
int feasible(int row, int col)
{
int l = col;
int r = col;
while (row--) {
l--; r++;
if (a[row][col] == 'Q') return 0;
if (l >= 0 && a[row][l] == 'Q') return 0;
if (r < n && a[row][r] == 'Q') return 0;
}
return 1;
}
另一种表示棋盘的方法是为每个文件保留皇后的排名,这样您就不必搜索了。不过,这会使电路板的打印稍微复杂一些。