FDS
Day2
dfs
1.扫雷游戏
代码
#include<bits/stdc++.h>
using namespace std;
long long ans,n,m,i,sx,sy,tx,ty,t,l,d,a[101][101],vis[101][101];
int dx[]={1,0,-1,0},dy[]={0,-1,0,1};//标记
void search(int x,int y)
{
if(x==tx&&y==ty){
ans++;//求方案
return ;
}
for(int i=0;i<4;i++){
int z=x+dx[i],g=y+dy[i];
if(a[z][g]==0&&vis[z][g]==0&&z>=1&&z<=n&&g>=1&&g<=m){
vis[z][g]=1;
search(z,g);//往下搜
vis[z][g]=0;//回溯
}
}
}
int main()
{
cin>>n>>m>>t>>sx>>sy>>tx>>ty;
for(i=1;i<=t;i++)
{
cin>>l>>d;
a[l][d]=1;
}
vis[sx][sy]=1;
search(sx,sy);
cout<<ans;
return 0;
}
2.八皇后
分析 x一行仅一个固定
搜索i
判断x轴与y轴的关系
代码
#include<bits/stdc++.h>
using namespace std;
int n,v1[100],v2[100],v3[100],a[100000],ans;
void dfs(int x)
{
if(x>n)//过终点
{
ans++;
if(ans<=3)
{
for(int i = 1 ; i <= n ; i++)cout<<a[i]<<" ";
cout<<endl;
}
}
for(int i=1 ; i <= n ; i++)
{
if(v1[i]==0 && v2[(x-i+n)]==0 && v3[x+i]==0)
{
a[x]=i;
v1[i]=1;
v2[(x-i+n)]=1;
v3[x+i]=1;
dfs(x+1);
v1[i]=0;
v2[(x-i+n)]=0;
v3[x+i]=0;//回溯
}
}
}
int main()
{
cin>>n;
dfs(1);
cout<<ans;
return 0;
}