/*八皇后问题的实现,回溯算法 8*8格的国际象棋,
使其不能相互攻击,即任意两个皇后不能处于同一行,同一列,或同意斜线上*/
#include <stdio.h>
#include<stdlib.h>
#define N 8 // 定义棋盘的格数, 通过改变,也可以是4皇后, 16皇后, 9皇后什么的.
int chess[N][N] = {0}; // 棋盘
int count = 0; // 有多少种放法
int canput(int row, int col) // 确定某一格能不能放
{
int i,j;
for(i = 0; i < N; i ++)
{
if(chess[i][col] == 1) //有同列的
{
return 0;//不管是主函数还是子函数,只要执行return,就会结束该函数
}
for(j = 0; j < N; j++)
{
if(chess[row][j]==1) //有同行的
{
return 0;
}
if(((i-row)==(j-col)||(i-row)==(col-j))&&chess[i][j]==1) // 对角线上有的
{
return 0;
}
}
}
return 1;
}
void print_chess() // 打印放置的方案//
{
int i, j;
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
printf("%d ", chess[i][j]);
}
printf("\n");
}
printf("\n");
}
int put(int row) // 放置棋子, row是从哪一行开始, 通常是0
{
int j, s;
for(j = 0; j < N; j++) // 此一行的每一个格子都要试试能不能放
{
if(canput(row, j)) // 假如这格能放的话
{
chess[row][j] = 1; // 放置
if(row == N-1) // 已经到了最后一行, 那么肯定成功******************************************************
{
count = count +1;
print_chess();
chess[row][j] = 0; //成功后, 寻找下一种方法
continue;
}
s= put(row+1); // 放置下一行的
if(s == 0) // 假如下一行不能放
{
chess[row][j] = 0; // 那么这格是放错了的, 清除
continue; // 找本行的下一个方格
}
else
{
break;
}
}
}
if(j==N) // 如果这一行的每个空格都不能放置
{
return 0; // 那么本行放置失败
}
else
{
return 1; // 本行放置成功
}
}
int main()//
{
int s ;
s = put(0); // 放置
printf("the number of put way is %d\n",count); //打印信息
system("pause");
return 0;
}
#include <iostream>
using namespace std;
#define MAX 15
char map[MAX][MAX];
int column[MAX];//标记:该行已经有皇后则为1,否则为0
int zxie[MAX];//标记:该主斜线已经有皇后则为1,否则为0
int fxie[MAX];//标记:该辅斜线已经有皇后则为1,否则为0
int N;
int sum;
void output()
{
for(int i=0;i<N;++i)
{
for(int j=0;j<N;++j)
cout<<map[i][j];
cout<<sum;
cout<<endl;
}
cout<<endl;
}
void queue8(int row)//形式参数是row行数
{
for(int i=0;i<N;i++)//列
{
if(column[i]==0 && zxie[i-row+N-1]==0 && fxie[i+row]==0)//不冲突
{
map[row][i]='@';
column[i]=1;
zxie[i-row+N-1]=1;
fxie[i+row]=1;
if(row<(N-1))
queue8(row+1);
else
{
output();
sum++;
}
//回溯
map[row][i]='*';
column[i]=0;
zxie[i-row+N-1]=0;
fxie[i+row]=0;
}
}
}
int main()
{
while(cin>>N && N!=0)
{
memset(map, '*', sizeof(map));
memset(column, 0, sizeof(column));
memset(zxie, 0, sizeof(zxie));
memset(fxie, 0, sizeof(fxie));
sum=0;
queue8(0);
cout<<"总共有"<<sum<<"种摆法。"<<endl;
}
return 0;
}