读书人

8皇后对角线判断//不了解。

发布时间: 2013-09-06 10:17:17 作者: rapoo

八皇后对角线判断//不了解。。。
八皇后对角线判断//不了解,N=5
递归 row = 2, 执行if(column[i]==0 && zxie[i-row+N-1]==0 && fxie[i+row]==0)
i=1时, zxie[1-2+5-1] && yxie[1+2] //怎么都是4呢。。。。
i=2时, zxie[2-2+5-1] && yxie[2+2] //怎么都是4呢。。。。


#include "stdafx.h"
#include "stdafx.h"
#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;
}


[解决办法]
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
退出条件
参数有哪些
返回值是什么
局部变量有哪些
全局变量有哪些
何时输出
会不会导致堆栈溢出

读书人网 >C++

热点推荐