最近蓝桥杯也快开始了,得练练DFS,BFS等暴力搜索。
之前感觉好像学会了,但是真正做题就会发现没有那么简单,一道问题就能卡好久。
所以还是要多做题。
这道题http://acm.hdu.edu.cn/showproblem.php?pid=2553就是N*N的棋盘上要放N个皇后有多少种放法,规则就是国际象棋的规则。卡了我好久,所以代码比较糟糕,但是懒的再改了。
我的方法就是一行一行的搜索,到最后一行的时候,如果可以放置,结果+1,然后返回。
要说起来也是个比较简单的DFS,但是想把想法变成编程语言还是要多练习,否则就得浪费很多时间。
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
using namespace std;
int a[13][13];//棋盘
int res;
int d[13];//保存结果
int g;//g是棋盘的大小。
bool if_in(int x,int y,int n){//判断是否可以放置。
int i,j;
bool flag=true;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(a[i][j]==1){
if(i==x||j==y||(abs(x-i)==abs(y-j))){
flag=false;
break;
}
}
}
if(!flag)break;
}
return flag;
}
void dfs(int n){//传入的是行
int i,j;
if(n==g){
for(j=1;j<=g;j++){
if(a[n][j]==0&&if_in(n,j,g)){//最后一行可以放置的点,结果+1.然后退回到上一行。
res++;
}
}
return;
}
for(j=1;j<=g;j++){
if(a[n][j]==0&&if_in(n,j,g)){
a[n][j]=1;
dfs(n+1);
a[n][j]=0;
}
}
}
int main()
{ int i;
for(i=1;i<=10;i++){
res=0;
g=i;
memset(a,0,sizeof(a));
dfs(1);//从第一行开始
d[i]=res;//将结果保存到数组。其实可以直接用数组,但是我懒得改了
}
int t;
while(scanf("%d",&t)!=EOF){
if(t==0)break;
cout<<d[t]<<endl;
}
return 0;
}