M - Find a way

本文介绍了一种使用双向BFS算法解决迷宫中两个角色寻找相遇点的问题。通过分别从两个起点进行广度优先搜索,并记录可达路径长度,最终找到两者相遇所需的最短步数。此算法适用于解决含有障碍物的地图上寻找最短路径问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


记下两人坐标同时BFS即可,注意有的KCF可能到不了的情况


#include <iostream>
#include <stdio.h>
#include <cstring>
#include <queue>
using namespace std;
int m,n,vis[210][210],t[210][210],t1[210][210];
char a[210][210];
struct point
{
    int x;
    int y;
}po[4];
queue<point>q;

void BFS1()
{
    int x,y,i;
    while(!q.empty())
    {
        po[3]=q.front();q.pop();
        x=po[3].x;y=po[3].y;i=t1[y][x];
        x++;
        if(x<=n&&vis[y][x]==0&&(a[y][x]=='.'||a[y][x]=='@'))
            {vis[y][x]=1;t1[y][x]=i+1;po[3].x=x;po[3].y=y;q.push(po[3]);}
        x-=2;
        if(x>=1&&vis[y][x]==0&&(a[y][x]=='.'||a[y][x]=='@'))
            {vis[y][x]=1;t1[y][x]=i+1;po[3].x=x;po[3].y=y;q.push(po[3]);}
        x++;y++;
        if(y<=m&&vis[y][x]==0&&(a[y][x]=='.'||a[y][x]=='@'))
            {vis[y][x]=1;t1[y][x]=i+1;po[3].x=x;po[3].y=y;q.push(po[3]);}
        y-=2;
        if(y>=1&&vis[y][x]==0&&(a[y][x]=='.'||a[y][x]=='@'))
            {vis[y][x]=1;t1[y][x]=i+1;po[3].x=x;po[3].y=y;q.push(po[3]);}
    }
    return;
}

void BFS2()
{
    int x,y,i;
    while(!q.empty())
    {
        po[3]=q.front();q.pop();
        x=po[3].x;y=po[3].y;i=t[y][x];
        x++;
        if(x<=n&&vis[y][x]==0&&(a[y][x]=='.'||a[y][x]=='@'))
            {vis[y][x]=1;t[y][x]=i+1;po[3].x=x;po[3].y=y;q.push(po[3]);}
        x-=2;
        if(x>=1&&vis[y][x]==0&&(a[y][x]=='.'||a[y][x]=='@'))
            {vis[y][x]=1;t[y][x]=i+1;po[3].x=x;po[3].y=y;q.push(po[3]);}
        x++;y++;
        if(y<=m&&vis[y][x]==0&&(a[y][x]=='.'||a[y][x]=='@'))
            {vis[y][x]=1;t[y][x]=i+1;po[3].x=x;po[3].y=y;q.push(po[3]);}
        y-=2;
        if(y>=1&&vis[y][x]==0&&(a[y][x]=='.'||a[y][x]=='@'))
            {vis[y][x]=1;t[y][x]=i+1;po[3].x=x;po[3].y=y;q.push(po[3]);}
    }
    return;
}

int main()
{
    int i,j,s;
    while(~scanf("%d %d",&m,&n))
    {
        s=100000;memset(t,0,sizeof(t));memset(t1,0,sizeof(t1));
        if(m==0&&n==0) break;
        for(j=1;j<=m;j++)
        {
            getchar();
            for(i=1;i<=n;i++)
            {
                scanf("%c",&a[j][i]);
                if(a[j][i]=='Y') {po[1].x=i;po[1].y=j;}
                if(a[j][i]=='M') {po[2].x=i;po[2].y=j;}
            }
        }
        memset(vis,0,sizeof(vis));
        q.push(po[1]);vis[po[1].y][po[1].x]=1;BFS1();
        memset(vis,0,sizeof(vis));
        q.push(po[2]);vis[po[2].y][po[2].x]=1;BFS2();
        for(j=1;j<=m;j++)
            for(i=1;i<=n;i++) if(a[j][i]=='@'&&t[j][i]+t1[j][i]<s&&t[j][i]!=0&&t1[j][i]!=0) s=t[j][i]+t1[j][i];
        printf("%d\n",s*11);
    }
    return 0;
}

#!/bin/bash #source ~/.bashrc source /etc/profile #本文作用:当前目录下所有jar的启动-重启-停止-findall等操作 #tset.sh stop -a (如果该JAR包已启动则先杀后启) #主要指令 分为 start(启动) stop(停止) 如果没写 则默认start #次要指令 -x {纯数字} (非必填) 设置JVM -a 启动当前文件夹下所有jar包(非必填) #方式1已验证成功 ./test123.sh startfile/stopfile/restartfile/ 根据事先写好的test1111.sh内容进行启动 #方式2已验证成功 ./test123.sh startall/stopall/restartall/ 根据当前路径下所有jar包进行启动 #命令3已验证成功 ./test123.sh c8085.jar(如果没起就起,如果已起就重启) #命令4已验证成功 ./test123.sh findall(查找出当前目录下所有*.jar格式的包) #备注:需要将di2lie里边的grep -v test123 改成启动文件名。 #test.sh {主要指令} echo "启动qidong" # 1启动 2停止 3重启 export JVM_XM="-Xms256 -Xmx256" export JAR_NAMES export JAR_PID #export java_path=`echo $JAVA_HOME` java_path=$(dirname $(dirname $(readlink -f $(which javac)))) #export java_path=`/home/jdk1.8.0_281` export pids=`ps -ef | grep $* | grep -v grep | awk '{print $2}'| xargs` export di1lie=`ps -ef | grep $* | grep -v 'grep' | awk '{print $1}' | xargs` export di2lie=`ps -ef | grep $* | grep -v "grep" | grep -v start123 | awk '{print $2}' | xargs` ##export aaa=($(find . -type f -name "*.jar" |sed 's#^\./##' |grep -v "/")) #当前文件夹下所有jar,暂时不用,但aaa的结果是对的 export FILE_NAME=($(find *.jar | awk '{print $1 ""}')) #当前文件夹所有jar export java_id=$(ps -ef|grep java |grep -v grep |awk '{print $2}') #-x 设置JVM 暂时未实现 #-a 启动当前文件夹全部jar包 已实现 ./test123.sh startall for arg in $*; do case $arg in #方式1 "startfile") #JAR_NAMES[${#JAR_NAMES[@]}]=$arg echo "startfile";; "stopfile") #JAR_NAMES[${#JAR_NAMES[@]}]=$arg echo "stopfile";; "restartfile") #JAR_NAMES[${#JAR_NAMES[@]}]=$arg echo "restartfile";; #方式2 "startall") #JAR_NAMES[${#JAR_NAMES[@]}]=$FILE_NAME echo "startall";; "stopall") #JAR_NAMES[${#JAR_NAMES[@]}]=$FILE_NAME echo "stopall";; "restartall") #JAR_NAMES[${#JAR_NAMES[@]}]=$FILE_NAME echo "restartall";; #命令3 *".jar") #JAR_NAMES[${#JAR_NAMES[@]}]=$arg echo ".jar";; #命令4 "findall") #JAR_NAMES[${#JAR_NAMES[@]}]=$FILE_NAME echo "findall";; esac done for name in ${JAR_NAMES[*]} do #$pids=`ps -ef | grep java | grep -v "grep" | awk '{print $2}'` # echo "${JAR_NAMES[*]} 000000000000000000" echo "000000000000000000" done for pid in $arg do case $arg in #方式1 "startfile") . ./test1111.sh #JAR_PID[${#JAR_PID[@]}]=`ps -ef | grep java | grep -v grep | awk '{print $2}' | xargs` pids=`ps -ef | grep java | grep -v "grep" | awk '{print $2}'` ;; "stopfile") pids=`ps -ef | grep java | grep -v "grep" | awk '{print $2}'` kill -9 $pids;; #JAR_PID[${#JAR_PID[@]}]=`ps -ef | grep java | grep -v grep | awk '{print $2}' | xargs` #kill -9 $JAR_PID;; "restartfile") pids=`ps -ef | grep java | grep -v "grep" | awk '{print $2}'` kill -9 $pids . ./test1111.sh;; #方式2 "startall") for i in ${!FILE_NAME[*]}; do jar_id=`(ps -ef | grep ${FILE_NAME[i]} | grep -v "grep" | grep -v start123 | awk '{print $2}' | xargs )` #进程 if [[ ( ${FILE_NAME[i]} == *"-comprehensive.jar"*) ]]; then #comprehensive包 if [[ ( $jar_id != "" ) ]]; then #起了就不起 echo "${FILE_NAME[i]} is already started! the process is $jar_id/" fi if [[ ( $jar_id == "" ) ]]; then #没起就起 nohup $java_path/bin/java -Dfile.encoding=utf-8 -Xms1500M -Xmx1500M -jar "${FILE_NAME[i]}" > "${FILE_NAME[i]}.log" 2>&1 & echo "${FILE_NAME[i]} is start readay!" fi elif [[ ( ${FILE_NAME[i]} == *"-auc.jar"*) ]]; then #auc包 if [[ ( $jar_id != "" ) ]]; then #起了就不起 echo "${FILE_NAME[i]} is already started,the process is $jar_id/" fi if [[ ( $jar_id == "" ) ]]; then #没起就起 nohup $java_path/bin/java -Dfile.encoding=utf-8 -Xms500M -Xmx500M -jar "${FILE_NAME[i]}" > "${FILE_NAME[i]}.log" 2>&1 & echo "${FILE_NAME[i]} is start readay!" fi else if [[ ( $jar_id != "" ) ]]; then #起了就不起 echo "${FILE_NAME[i]} is already started,the process is $jar_id/" fi if [[ ( $jar_id == "" ) ]]; then #没起就起 nohup $java_path/bin/java -Dfile.encoding=utf-8 -Xms256M -Xmx256M -jar "${FILE_NAME[i]}" > "${FILE_NAME[i]}.log" 2>&1 & echo "${FILE_NAME[i]} is start readay!" fi fi printf "\n" done ;; "stopall") abc=$(pwd) #shell脚本里。获取当前路径值赋值给abc echo "pwd:$(pwd)" for id in ${java_id[*]}; do exe_path=$(readlink /proc/$id/cwd) if [[ "$exe_path" == "$abc" ]];then #echo "id=$id~~~~~~~~~~~" kill -9 $id echo "$id is killed" else echo "the process:$id start way is not in $abc ,the way is in $exe_path" fi; done ;; "restartall") abc=$(pwd) #shell脚本里。获取当前路径值赋值给abc for id in ${java_id[*]}; do exe_path=$(readlink /proc/$id/cwd) if [[ "$exe_path" == "$abc" ]];then kill -9 $id echo "$id is killed" else echo "the process:$id start way is not in $abc , the way is in $exe_path" fi; done for i in ${!FILE_NAME[*]}; do if [[ ( ${FILE_NAME[i]} == *"-comprehensive.jar"*) ]]; then #comprehensive包 if [[ ($di1lie=="root root root" )&&( $di2lie != "" )]] ; then #comprehensive起了,先杀再起 kill -9 $di2lie nohup $java_path/bin/java -Dfile.encoding=utf-8 -Xms1500M -Xmx1500M -jar $abc/${FILE_NAME[i]} > $abc/${FILE_NAME[i]}.log 2>&1 & echo "$di2lie is start ready!" fi if [[ ( $di1lie == "root root" )&&( $di2lie == "" ) ]]; then #comprehensive没起,就起 nohup $java_path/bin/java -Dfile.encoding=utf-8 -Xms1500M -Xmx1500M -jar $abc/${FILE_NAME[i]} > $abc/${FILE_NAME[i]}.log 2>&1 & echo "${FILE_NAME[i]} is start readay!" fi elif [[ ( ${FILE_NAME[i]} == *"-auc.jar"*) ]]; then #auc包 if [[ ($di1lie=="root root root" )&&( $di2lie != "" )]] ; then #auc起了,先杀再起 kill -9 $di2lie nohup $java_path/bin/java -Dfile.encoding=utf-8 -Xms500M -Xmx500M -jar $abc/${FILE_NAME[i]} > $abc/${FILE_NAME[i]}.log 2>&1 & echo "${FILE_NAME[i]} is start ready!" fi if [[ ( $di1lie == "root root" )&&( $di2lie == "" ) ]]; then #auc没起,就起 nohup $java_path/bin/java -Dfile.encoding=utf-8 -Xms500M -Xmx500M -jar $abc/${FILE_NAME[i]} > $abc/${FILE_NAME[i]}.log 2>&1 & echo "${FILE_NAME[i]} is start readay!" fi else #其他包 if [[ ($di1lie=="root root root" )&&( $di2lie != "" ) ]]; then #起了先杀再起111 kill -9 $di2lie nohup $java_path/bin/java -Dfile.encoding=utf-8 -Xms256M -Xmx256M -jar $abc/${FILE_NAME[i]} > $abc/${FILE_NAME[i]}.log 2>&1 & echo "${FILE_NAME[i]} is restart readay!" fi if [[ ( $di1lie == "root root" )&&( $di2lie == "" ) ]]; then #没起就起 nohup $java_path/bin/java -Dfile.encoding=utf-8 -Xms256M -Xmx256M -jar $abc/${FILE_NAME[i]} > $abc/${FILE_NAME[i]}.log 2>&1 & echo "${FILE_NAME[i]} is start readay!" fi fi done ;; #命令3 *".jar") abc=$(pwd) if [[ ($* == *-comprehensive.jar*) ]]; then #comprehensive包 if [[ ($di1lie=='root root root' )&&( $di2lie != '' )]] ; then #comprehensive起了,先杀再起 kill -9 $di2lie nohup $java_path/bin/java -Dfile.encoding=utf-8 -Xms1500M -Xmx1500M -jar "$abc/$*" > "$abc/$*.log" 2>&1 & echo "$arg is start ready!" fi if [[ ( $di1lie == 'root root' )&&( $di2lie == '' ) ]]; then #comprehensive没起,就起 nohup $java_path/bin/java -Dfile.encoding=utf-8 -Xms1500M -Xmx1500M -jar "$abc/$*" > "$abc/$*.log" 2>&1 & echo "$* is start readay!" fi elif [[ ($* == *-unify.jar*) ]]; then #unify包 if [[ ($di1lie=='root root root' )&&( $di2lie != '' )]] ; then #unify起了,先杀再起 kill -9 $di2lie nohup $java_path/bin/java -Dfile.encoding=utf-8 -Xms500M -Xmx500M -jar "$abc/$*" > "$abc/$*.log" 2>&1 & echo "$arg is start ready!" fi if [[ ( $di1lie == 'root root' )&&( $di2lie == '' ) ]]; then #unify没起,就起 nohup $java_path/bin/java -Dfile.encoding=utf-8 -Xms500M -Xmx500M -jar "$abc/$*" > "$abc/$*.log" 2>&1 & echo "$* is start readay!" fi elif [[ ($* == *-auc.jar*) ]]; then #auc包 if [[ ($di1lie=='root root root' )&&( $di2lie != '' )]] ; then #auc起了,先杀再起 kill -9 $di2lie nohup $java_path/bin/java -Dfile.encoding=utf-8 -Xms500M -Xmx500M -jar "$abc/$*" > "$abc/$*.log" 2>&1 & echo "$arg is start ready!" fi if [[ ( $di1lie == 'root root' )&&( $di2lie == '' ) ]]; then #auc没起,就起 nohup $java_path/bin/java -Dfile.encoding=utf-8 -Xms500M -Xmx500M -jar "$abc/$*" > "$abc/$*.log" 2>&1 & echo "$* is start readay!" fi else #其他包 if [[ ($di1lie=='root root root' )&&( $di2lie != '' ) ]]; then #起了先杀再起111 kill -9 $di2lie nohup $java_path/bin/java -Dfile.encoding=utf-8 -Xms256M -Xmx256M -jar "$abc/$*" > "$abc/$*.log" 2>&1 & echo "$* is restart readay!" fi if [[ ( $di1lie == 'root root' )&&( $di2lie == '' ) ]]; then #没起就起 nohup $java_path/bin/java -Dfile.encoding=utf-8 -Xms256M -Xmx256M -jar "$abc/$*" > "$abc/$*.log" 2>&1 & echo "$* is start readay!" fi fi ;; #命令4 "findall") echo "$(pwd)/下有如下包:" for i in ${!FILE_NAME[*]}; do echo "${FILE_NAME[i]}" done printf "\n" echo "$(pwd)/下未启动的包有:" for i in ${!FILE_NAME[*]}; do no_id=$(ps -ef | grep ${FILE_NAME[i]} | grep -v "grep" | grep -v start123 | awk '{print $2}' | xargs) if [[ -z "${no_id}" ]]; then echo "${FILE_NAME[i]}!" fi done printf "\n" echo "$(pwd)/下启动的包有:" for i in ${!FILE_NAME[*]}; do no_id=$(ps -ef | grep ${FILE_NAME[i]} | grep -v "grep" | grep -v start123 | awk '{print $2}' | xargs) if [[ ! -z "${no_id}" ]]; then echo "${FILE_NAME[i]}已启动,进程ID为${no_id}" fi done esac done printf "\n" echo "结束jieshu" 如何让这个脚本,让通过ssh执行的这个脚本时,脚本能正确获取java环境
最新发布
07-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值