[kuangbin带你飞]专题一 简单搜索 I

题目:[kuangbin带你飞]专题一 简单搜索 I


思路:看题目就是一题bfs题目,和传统题目不通在于:

  • 开始的点是两个点,而且有多种不同的状态,需要枚举取最小时间。
  • 不是去搜索一个点,而是去搜索所有连通的地方算得到最短时间。

如何判断搜索是否完成?

  • 判断该点为#,且未访问过,那么就没有搜索完成。

if(mm[i][j]=='#'&&!vis[i][j])


我的代码:

#include
#include
#include
#define MaxN  0x3f3f3f3f
using namespace std;
int R,C; 
int mov[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
bool vis[110][110];
char mm[110][110];
struct node {
    int x;
    int y;
    int time;
};

bool check(node nownode){
    if(nownode.x<0||nownode.y<0||nownode.x>=R||nownode.y>=C||vis[nownode.x][nownode.y]||mm[nownode.x][nownode.y]!='#')
        return false;
    return true;
}


int bfs(node st1,node st2){
    queue Q;
    Q.push(st1);
    Q.push(st2);
    vis[st1.x][st1.y] = true;
    vis[st2.x][st2.y] = true;
    node nownode;
    node nextnode;
    while(!Q.empty()){
        nownode = Q.front();Q.pop();
        for(int i =0 ;i<4;i++){
            nextnode.x = nownode.x+mov[i][0];
            nextnode.y = nownode.y+mov[i][1];
            if(check(nextnode)){
                vis[nextnode.x][nextnode.y] = true;
                nextnode.time = nownode.time + 1;
                Q.push(nextnode);
            }
        }
    }
    return nownode.time;
}

bool test(){
    for(int i = 0;i>R>>C;
        for(int i =0;i>mm[i][j];
            }
        }
}



int main(){
    int T;
    int ccase=0;
    cin>>T;
    while(T--){
        init();
        int mintime;
        mintime = enumerate();
        if(mintime==MaxN){
            cout<<"Case "<<++ccase<<": -1"<

你可能感兴趣的:([kuangbin带你飞]专题一 简单搜索 I)