8皇后问题 C语言
来源:百度知道 编辑:UC知道 时间:2024/06/22 13:19:11
帮我看一下,那个递归 问题出在哪?
#include <stdio.h>
#define N 8 /*定义列数*/
int arcflag[N]={0};
int incflag1[2*N-1]={0};
int incflag2[2*N-1]={0};
int qm[N][N]={0};
int checkarcoss (int j) //该列有没有被占领
{
if(arcflag[j]==0)
return 1; //没有别占领,可以放置皇后的可选列
return 0;
}
//该丿斜有没有被占领
int checkincline1 (int i,int j)
{
if (incflag1[i+j]==0)
return 1; //没有别占领,可以放置皇后的可选丿斜斜
return 0;
}
int checkincline2(int i,int j) //判断 捺斜有没有被占领
{
if (incflag2[i-j+7]==0)
return 1; //没有别占领,可以放置皇后的可选捺斜列
return 0;
}
void queen(int n)
{ int i,j;
if(n>=N)
{
for ( i=0;i<N;i++)
{
for (j=0;j<N;j++)
printf("%d &q
#include <stdio.h>
#define N 8 /*定义列数*/
int arcflag[N]={0};
int incflag1[2*N-1]={0};
int incflag2[2*N-1]={0};
int qm[N][N]={0};
int checkarcoss (int j) //该列有没有被占领
{
if(arcflag[j]==0)
return 1; //没有别占领,可以放置皇后的可选列
return 0;
}
//该丿斜有没有被占领
int checkincline1 (int i,int j)
{
if (incflag1[i+j]==0)
return 1; //没有别占领,可以放置皇后的可选丿斜斜
return 0;
}
int checkincline2(int i,int j) //判断 捺斜有没有被占领
{
if (incflag2[i-j+7]==0)
return 1; //没有别占领,可以放置皇后的可选捺斜列
return 0;
}
void queen(int n)
{ int i,j;
if(n>=N)
{
for ( i=0;i<N;i++)
{
for (j=0;j<N;j++)
printf("%d &q
回溯时写的不对
if (checkarcoss(j)&&checkincline1(n,j)&&checkincline2(n,j)) //可以作好皇后候选位置
{
printf("kao\n");
qm[n][j]=1; //对该皇后占领的位置标记
arcflag[j]=1;
incflag1[n+j]=1;
incflag2[n-j+N-1]=1;
queen(n+1);
qm[n][j]=0;
arcflag[j]=0;
incflag1[n+j]=0;
incflag2[n-j+N-1]=0;
}
看懂了么?
我并没有太仔细看你的程序,我也写过一个8皇后,希望你看了之后会有点想法。
#include <iostream>
#include <vector>
using namespace std;
const int size = 8; //是几就是几皇后
bool use[ size ][ size ];
vector <int> pace ( size );
bool solution = true;
void work( int t )
{
if ( solution && t <= size )
{
if ( t == size )
{
int i, j;
for ( i = 0; i < size; i++ )
{
for ( j = 0; j < size; j++ )
if ( j == pace[ i ] )
cout << 1;
else
cout <<