遗忘点
在GCC编译器下各个类型的全局变量的默认值:
1、表示数字的变量类型默认值都为0
2、bool型默认值为false
3、string型默认值为空字符串
4、char 型比较特殊。char类型默认值为’\0’, 即字符串结束标志,其整数值为0。如果用printf(“%d”)输出时值为 0, 但用printf(“%c”),或cout 输出时显示为”a”, char型数组默认值为空字符串,其中的每个元素与单个char类型相同,所以用puts() 和printf(“%s”) 输出都是空字符串。
DFS模板
bool 状态数组 //此题中有三个状态:本列是否已经有棋子(列状态),所在左斜线是否有棋子,所在右斜线是否有棋子
//套用dfs模板
void dfs(int m){
if(...){
...//结束情况
return;
}
for(...){ //遍历每一种情况
if(...) //不合法情况
continue;
mp[m][i]='Q'; //合法操作
col[i]=true; //修改状态数组
...
dfs(m+1); //递归
mp[m][i]='.'; //恢复现场
col[i]=false;
...
}
}
C++ 代码
#include <iostream>
using namespace std;
const int N=10;
char mp[N][N];
bool col[N];
bool rl[2*N];
bool lel[2*N];
int n;
void dfs(int m){
if(m>=n){
for(int i=0;i<n;i++){
cout<<mp[i];
cout<<endl;
}
cout<<endl;
return;
}
for(int i=0;i<n;i++){
if(col[i]||rl[n-1-m+i]||lel[m+i])
continue;
mp[m][i]='Q';
col[i]=true;
rl[n-1-m+i]=true;
lel[m+i]=true;
dfs(m+1);
mp[m][i]='.';
col[i]=false;
rl[n-1-m+i]=false;
lel[m+i]=false;
}
}
int main()
{
cin>>n;
//初始化
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
mp[i][j]='.';
}
}
dfs(0);
return 0;
}