DFS与BFS

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值