2016年第七届蓝桥杯国赛C++ A组 路径之谜(DFS+回溯)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=25;
int arr[maxn][maxn];//n*n矩阵
int a[maxn];//西->东
int b[maxn];//北->南
int n;
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
bool vis[maxn][maxn];
struct Point{
int x,y;
//记录到达每个点的路径
string road;
Point(){}
Point(int xx,int yy){
x=xx;
y=yy;
}
};

bool check(){
for(int i=0;i<n;i++)
      if(a[i]!=0||b[i]!=0)
    return false;

  return true;
}

void dfs(Point p){
    if(p.x==n-1&&p.y==n-1){
        if(check())
        cout<<p.road<<endl;

    return;
    }

    for(int i=0;i<4;i++){
        int dx=p.x+dir[i][0];
        int dy=p.y+dir[i][1];
        if(dx>=0&&dx<n&&dy>=0&&dy<n&&!vis[dx][dy]&&a[dy]!=0&&b[dx]!=0){
            Point next;
            next.x=dx;
            next.y=dy;
            string nextroad=to_string(arr[dx][dy]);
            next.road=p.road+" "+nextroad;
            vis[dx][dy]=true;
            a[dy]--;
            b[dx]--;


          dfs(next);
            //状态回溯
           vis[dx][dy]=false;
            a[dy]++;
            b[dx]++;


        }
    }





}



int main(){

cin>>n;
int temp=0;
for(int i=0;i<n;i++){
    for(int j=0;j<n;j++){
    arr[i][j]=temp++;
}
}

for(int j=0;j<n;j++){
    cin>>a[j];
}
for(int i=0;i<n;i++){
    cin>>b[i];
}


//初始化第一个点
Point pp;
pp.x=pp.y=0;
pp.road="0";
vis[0][0]=true;
a[0]--;
b[0]--;
dfs(pp);

return 0;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值