首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-09-06 
八皇后对角线判断//不了解。。。八皇后对角线判断//不了解,N5递归 row 2, 执行if(column[i]0 &&zxie[i-r

八皇后对角线判断//不了解。。。
八皇后对角线判断//不了解,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里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出

热点排行