DFS
洛谷P1706
#include<bits/stdc++.h>
using namespace std;
int n;
int pd[100],a[100];//pd用来判断这个数
void dfs(int x)
{
int i;
if(x==n)
{
int i;
for(i=1;i<=n;i++)
printf("%5d",a[i]);//保留答案之间的间隔,用cout也可以只是比较麻烦
cout<<endl;
return;
}
for(i=1;i<=n;i++)
{
if(!pd[i])//如果当前数没有用过
{
a[x+1]=i;//把这个数填入数组
pd[i]=1;//再把这个数标记
dfs(x+1);
pd[i]=0;
}
}
}
int main()
{
cin>>n;
dfs(0);
return 0;
}
洛谷P1605
#include<bits/stdc++.h> using namespace std; const int zx[4] = {0,0,1,-1};//四个方向x和y的变化 const int zy[4] = {1,-1,0,0}; int ans,sx,sy,fx,fy,a,b,c; int t[6][6]; void dfs(int x,int y){ if(x > a||y > b||x < 1||y < 1||t[x][y]==1)return;//如果出界了,就返回 if(x == fx&&y ==fy){//到达终点时,给答案+1 ans++; return; } t[x][y]=1;//标记走过的地方 for(int i = 0;i < 4;i++){ dfs(x + zx[i],y + zy[i]);//四个方向的递归 } t[x][y]=0; } int main(){ cin>>a>>b>>c>>sx>>sy>>fx>>fy; for(int i = 1;i <= c;i++){ int bx,by; cin>>bx>>by; t[bx][by]=1; } dfs(sx,sy); cout << ans; return 0; }
BFS
洛谷P1135
#include<bits/stdc++.h> using namespace std; int n,a,b,ans=0; int k[210]={0},tl[2000][2]={0};//tl当队列,k用来储存该楼层的数字 bool d[210]={0};//记忆化 int head=0,tail=1; void bfs() { int now; do { head++; now=tl[head][0];//判断能不能去 if(now+k[now]<=n)//上爬 { tail++;//d数组表明已经去过 if(!d[now+k[now]]) tl[tail][0]=now+k[now],tl[tail][1]=tl[head][1]+1,d[now+k[now]]=1; else tail--; } if(now-k[now]>0)//下爬 { tail++; if(!d[now-k[now]]) tl[tail][0]=now-k[now],tl[tail][1]=tl[head][1]+1,d[now-k[now]]=1; else tail--; } }while(now!=b&&head<tail); ans=tl[head][1]; if(head==tail&&tl[head][0]!=b) ans=-1;//如果到不了输出-1 } int main() { cin>>n>>a>>b; if(a==b) { cout<<0; return 0; } for(int i=1;i<=n;i++) scanf("%d",&k[i]); tl[1][0]=a; bfs(); cout<<ans; return 0; }