#include<stdio.h>
int sum=0; //存放方案数
int a[8][8]={0}; //棋盘,初始化0
int take[8][2]={0}; //存放每个满足条件皇后的位置
int test(int x,int y){ //检测是否满足条件
int i,j;
for(i=0;i<8;i++){
for(j=0;j<8;j++){
if(i==x||j==y||i+j==x+y||i-j==x-y){
if(a[i][j]) return 0; //遍历棋盘,找出x,y坐标对应的行,列与斜线,只要其中有一个放置了皇后,就不满足,return 0。
}
}
}
return 1;
}
void try(int n);
int main(void){
try(1); //从第一个皇后开始尝试放置
return 0;
}
void try(int n){
int i,j;
for(i=0;i<8;i++){
for(j=0;j<8;j++){ //i,j遍历整个棋盘,找出对于第n个皇后的所有可能位置
if(test(i,j)){ //满足条件
a[i][j]=1; //棋盘上对应的坐标标记为已放置状态
take[n-1][0]=i;
take[n-1][1]=j; //记录
if(n==8){ //8个皇后都放置完毕
sum++;
printf("第%d种:",sum);
for(i=0;i<8;i++){
printf("(%d,%d) ",take[i][0],take[i][1]);
}
printf("\n"); //输出
}
else{
try(n+1); //递归放置下一个皇后
}
a[i][j]=0; //回溯
}
}
}
}
帮忙看看哪里出错了 感觉思路很清楚 但是只能打印出一组方案
那是当然只会输出一个数字了。你琢磨一下自己的递归深度有多深。一直在向下递归递归……
#include<stdio.h>
#define line 8
void queen(int i, int j);
int check(int i, int j);
int chess[line][line];
int cas = 0;
int xx, yy;
int main() {
queen(0, 0);
printf("%d\n", cas);
return 0;
}
void queen(int i, int j) {
if (j >= line) {
return;
}
if (check(i, j) == 1) {//如果能放
chess[i][j] = 1;//放皇后
if (i == line - 1) {//如果是最后一行,记录情况
cas++;
//下面是输出每种棋盘结果,供测试
/*
for (xx=0;xx<8;xx++)
for(yy=0;yy<8;yy++){
printf("%d",chess[xx][yy]);
if(yy==7)
printf("\n");
}
printf("\n");
//上面是输出结果*/
//另一种输出方式
printf("第%d种解法:",cas);
for (xx = 0; xx < 8; xx++)
for (yy = 0; yy < 8; yy++) {
if(chess[xx][yy])
printf("(%d, %d) ", xx, yy);
}
printf("\n");
}
else {
queen(i + 1, 0);//不是最后一行就分析下一行
}
}
chess[i][j] = 0;//如果此位置不能放,就置空(0),判断旁边的格子。
//如果此位置能放,走到这里就意味着上面的代码全部执行了,把皇后拿走(置零),再讨论其他情况,拿旁边位置试探。
queen(i, j + 1);
}
int check(int i, int j) {
int k;
for (k = 0; k < line; k++) {
if (chess[i][k] == 1) return 0;//0=不能放
}
for (k = 0; k < line; k++) {
if (chess[k][j] == 1) return 0;
}
for (k = -line; k <= line; k++) {//两对角线
if (i + k >= 0 && i + k < line && j + k >= 0 && j + k < line)//从左上到右下对角线
if (chess[i + k][j + k] == 1) return 0;
if (i - k >= 0 && i - k < line && j + k >= 0 && j + k < line)//从左下到右上对角线
if (chess[i - k][j + k] == 1) return 0;
}
return 1;
}
你这什么排版。。。看的云里雾里的。
我没认真看结果是否正确,但是你的32行那里就出问题了,你的i原本是在23行那边用来迭代计数的,但是你再32行这里又修改了i的值,最后你打印完数组之后,你的i=8,返回23行的时候就直接退出了。
#include<stdio.h>
#define N 8
char board[N+2][N+2];
int count = 0;
struct Pos
{
int yos; //行偏移量
int xos; //列偏移量
};
struct Pos pos[3] = { { -1, -1 }, { -1, 0 }, { -1, 1 } };
void Init(void)
{
for (int row = 0; row < N + 2; row++)
{
for (int col = 0; col < N + 2; col++)
{
board[0][col] = '#';
board[N + 1][col] = '#';
board[row][0] = '#';
board[row][N + 1] = '#';
}
}
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= N; j++)
{
board[i][j] = ' ';
}
}
}
void Show(void)
{
for (int i = 0; i < N + 2; i++)
{
for (int j = 0; j < N + 2; j++)
{
printf("%c", board[i][j]);
}
printf("\n");
}
}
int Check(int row, int col)
{
int ret = 1;
int nr;
int nc;
for (int i = 0; i < 3 && ret; i++)
{
nr = row;
nc = col;
while (ret&&board[nr][nc] != '#')
{
if (board[nr][nc] == '*')
{
ret = 0;
break;
}
nr = nr + pos[i].yos;
nc = nc + pos[i].xos;
}
}
return ret;
}
void Find(int row)
{
if (row>N)
{
Show();
count++;
printf("%d\n",count);
}
else
{
for (int col = 1; col <= N; col++)
{
if (Check(row, col))
{
board[row][col] = '*';
Find(row + 1);
board[row][col] = ' ';
}
}
}
}
int main()
{
Init();
Find(1);
system("pause");
}