CSL的校园卡

CSL的校园卡

题意:A和B两个人从1个点出发,问走遍整张图最少要多少时间

思路:

用dis[x1][y1][x2][y2][statu]:A在(x1,y1),B在(x2,y2)遍历过点用statu的二进制状态表示

接下来暴力bfs

用二进制来表示转移过的点。还有vis数组标记一定要写在入队的地方,写在出队的地方复杂度翻一番

#include <bits/stdc++.h>
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
using namespace std;
typedef long long ll;
template <class T>
bool sf(T &ret){ //Faster Input
    char c; int sgn; T bit=0.1;
    if(c=getchar(),c==EOF) return 0;
    while(c!='-'&&c!='.'&&(c<'0'||c>'9')) c=getchar();
    sgn=(c=='-')?-1:1;
    ret=(c=='-')?0:(c-'0');
    while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
    if(c==' '||c=='\n'){ ret*=sgn; return 1; }
    while(c=getchar(),c>='0'&&c<='9') ret+=(c-'0')*bit,bit/=10;
    ret*=sgn;
    return 1;
}
 
 
int all,sx,sy,n,m;
char mp[5][5];
int HASH(int i , int j){
    return 1<<((i-1)*m+j);
}
struct node{
    int x1,y1,x2,y2,s;
};
int dir[4][2]={1,0,-1,0,0,1,0,-1};
bool vis[5][5][5][5][1<<17];
int dis[5][5][5][5][1<<17];
bool check(int x,int y){
    if(x>=1&&x<=n&&y>=1&&y<=m)    return true;
    return false;
}
ll cnt;
int bfs(){
    queue <node> q;
    q.push((node){sx,sy,sx,sy,HASH(sx,sy)});
    while(!q.empty()){
        node now=q.front();
        q.pop();
        if(now.s==all){
            return dis[now.x1][now.y1][now.x2][now.y2][now.s];
        }
        // vis如果写在这里,很多点会反复入队。
//        vis[now.x1][now.y1][now.x2][now.y2][now.s]=true;
    
        for(int i=0;i<=3;i++){
            int nx1=now.x1+dir[i][0],ny1=now.y1+dir[i][1];
            if(!check(nx1,ny1) || mp[nx1][ny1]=='X')    continue;
            for(int j=0;j<=3;j++){
                int nx2=now.x2+dir[j][0],ny2=now.y2+dir[j][1];
                int gg=now.s|(HASH(nx1,ny1))|(HASH(nx2,ny2));
                if(!check(nx2,ny2) || vis[nx1][ny1][nx2][ny2][gg] || mp[nx2][ny2]=='X')  continue;
                node t=(node){nx1,ny1,nx2,ny2,gg};
                vis[nx1][ny1][nx2][ny2][gg]=true;
                dis[nx1][ny1][nx2][ny2][gg]=dis[now.x1][now.y1][now.x2][now.y2][now.s]+1;
                q.push(t);
            }
        }
    }
    return 0;
}
 
int main(void){
    sf(n);sf(m);
    for(int i=1;i<=n;i++)   scanf("%s",mp[i]+1);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(mp[i][j]=='X')   continue;
            else if(mp[i][j]=='S')  sx=i,sy=j;
            all = all|HASH(i,j);
        }
    }
    printf("%d\n",bfs());
    return 0 ;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、被审计校园管理系统的业务概况 被审计校园管理系统主要包含个人信息管理、校园充值管理、校园消费、校园挂失情况管理等六部分管理功能,根据整体项目审计目标要求,对校园管理信息系统业务流程应用控制开展审计,涉及个人信息管理、校园充值管理等子系统或业务过程。该系统的主要业务流程控制可以描述为: 一、个人信息管理 1、审核学生提交的资料。 2、教务处工作人员进入系统,进行信息录入。录入成功后,系统自动生成学号。 3、工作人员录入后发现有误,在未复核之前,可以对交易信息进行修改;或复核人员复核已录入的信息发现有误时,退出复核,通知录入人员进行相应修改。 4、录入人员录入完成后,由复核人员进行复核。复核提交成功后,系统生成相关文档信息。 5、当学生离校时(如:毕业,退学等情况),教务处应审核相关文件,并通知工作人员将离校学生的个人信息系统中删除,最后进行复核。 二、校园充值管理 1、学生缴纳一定的现金并告知工作人员需要充值的具体金额。 2、工作人员辨别现金真伪。 3、工作人员输入学生学号,系统显示出学生校园上余额。 4、工作人员并输入充值金额。 5、系统更新校园余额,并在屏幕上显示,以供学生核对。 6、充值完成后工作人员检查是否需要找零,并将零钱找给学生。 二、业务流程划分及其控制 综上所述将业务流程及其子流程进行分解,按照业务流程的功能进行区分,使用表格描述法进行业务流程控制描述,如下所示: 利用业务流程图对每个子流程描述其处理及关键步骤、重要控制如下图:

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值