直接上代码
#include<iostream>
#include<memory.h>
#define N 8
using namespace std;
int t = 0; //全局变量,用来统计结果个数
void PrintResult(bool *p)
{
int i,j;
for(i = 0;i < N;i++)
{ cout << "/t";
for(j = 0;j < N;j++)
{
cout << " " << *(p + i*N + j);
}
cout << " " << endl; //放置一行后,跳到下一行
}
}
void PlaceQueen(int i,bool *G)
{
int j,m,n;
bool *C = new bool[N*N]; //新建动态数组指针 *C 指向该数组第一个成员位置
for(j = 0;j < N;j++)
{
if(*(G + i*N + j) == true) // 根据 指针G 来查询,如果成员为真,则可被攻击,舍弃
{
continue; //本行向后移动一位
}
else
{
for(m = 0;m < N;m++)
{
for(n = 0;n < N;n++)
{
*(C + m*N + n) = *(G + m*N + n); //做数组拷贝
}
}
// 画“木”字,即攻击范围为true,不改变皇后位置即为false
for(m = i+1,n = j-1;(m < N)&&(n >= 0);m++,n--)//左撇位置为true
*(C + m*N + n) = true;
for(m = i+1,n = j+1;(m < N)&&(n < 8);m++,n++) //右捺位置为true
*(C + m*N + n) = true;
for(m = i + 1,n = j;m < N;m++) //皇后下面都置为true
*(C + m*N + n) = true;
for(m = i,n = 0;n < N;n++) //本行除了皇后位置,都为true
{
if(n == j)
continue;
else
*(C + m*N + n) = true;
}
if(i < (N-1))
{
PlaceQueen(i+1,C); //不到最后一行时,放置下一个皇后
}
else
{
t++;
cout << "success!!!!!!!!!!!!!!! " << endl;
PrintResult(C);
delete[] C;
cout << "t = " << t << endl;
}
}
}
return;
}
int main()
{
bool Grid[N*N];
memset(Grid,0,sizeof(Grid)); //全部初始化为false
PlaceQueen(0,Grid);
cout << "End" << endl;
return 0;
}