0
点赞
收藏
分享

微信扫一扫

CCD机器视觉检测如何提高工业产品的质量?

题目链接:1.路径之谜 - 蓝桥云课 (lanqiao.cn)

题意:本题读好久才明白让干啥,就是每行每列走固定的次数,让你输出路径

思路:数据量很小,可以直接dfs枚举所有路径,直到找到符合条件的路径输出

代码:

#include<bits/stdc++.h>
using namespace std;
#define N 110

int n,cnt;
int a[N],b[N];
int x[]={1,-1,0,0},y[]={0,0,1,-1};
bool f=false,vis[N][N];
// 记录路径
vector<int> path;

void dfs(int u,int v,int st){
    // 提前返回
    if(f||st>cnt)return;
    if(st==cnt&&(u-1)*n+v-1==n*n-1){
        for(auto it:path)cout<<it<<" ";cout<<endl;
        f=true;
        return;
    }
    for(int i=0;i<4;i++){
        int xx=u+x[i];
        int yy=v+y[i];
        if(xx<1||yy<1||xx>n||yy>n)continue;
        if(vis[xx][yy])continue;
        if(a[yy]==0)continue;
        if(b[xx]==0)continue;
        a[yy]--,b[xx]--;
        vis[xx][yy]=true;
        path.push_back((xx-1)*n+yy-1);
        
        // 搜索下一个
        dfs(xx,yy,st+2);
        
        a[yy]++,b[xx]++;
        vis[xx][yy]=false;
        path.pop_back();
    }
}

int main(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++)cin>>b[i];
    // 记录一共射了多少箭
    for(int i=1;i<=n;i++)cnt+=a[i]+b[i];
    
    // 初始化起始位置
    a[1]--;b[1]--;
    vis[1][1]=true;
    path.push_back(0);
    
    dfs(1,1,2);
    
    
    return 0;
}
举报

相关推荐

0 条评论