• hdu 1175连连看 (bfs带方向变化次数)


    //用结构体进行广搜,便于记录方向变化次数
    #include<iostream>
    #include<queue>
    using namespace std;

    const int maxn = 1000 + 10;
    const int INF = 0x3fffffff;
    int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};
    int map[maxn][maxn];
    int n, m;
    int v[maxn][maxn];

    typedef struct{
    int x;
    int y;
    int d; //方向
    int c; //次数
    }node;
    node Start, End;

    void init(){
    for(int i=1; i<=n; i++){
    for(int j=1; j<=m; j++){
    v[i][j] = INF;
    }
    }
    }

    void bfs(){
    queue<node>q;
    node cur, pre;
    Start.d = -1;
    Start.c = 0;
    q.push(Start);
    while(!q.empty()){
    pre = q.front ();
    q.pop ();
    if(pre.x == End.x && pre.y == End.y){
    cout<<"YES"<<endl;
    return ;
    }
    for(int i=0; i<4; i++){
    cur.x = pre.x + dir[i][0];
    cur.y = pre.y + dir[i][1];
    cur.c = pre.c;
    cur.d = i;
    if(pre.d != cur.d && pre.d != -1){
    cur.c++;
    }
    if(cur.x < 1 || cur.y <1 || cur.x >n || cur.y > m || cur.c > 2){
    continue;
    }
    if(map[cur.x][cur.y] && !(cur.x == End.x && cur.y == End.y)){ //有阻碍
    continue;
    }
    if(cur.c<v[cur.x][cur.y]){ //新的转折次数小于以前访问时的转折次数那么更新,否则就不更新。
    v[cur.x][cur.y] = cur.c;
    q.push(cur);
    }
    }
    }
    cout<<"NO"<<endl;
    }

    int main(){
    while(cin>>n>>m){
    if(!(n && m))
    break;
    for(int i=1; i<=n; i++){
    for(int j=1; j<=m; j++){
    cin>>map[i][j];
    }
    }
    int t;
    cin>>t;
    while(t--){
    cin>>Start.x>>Start.y>>End.x>>End.y;
    if(!map[Start.x][Start.y] || !map[End.x][End.y] || (map[Start.x][Start.y] != map[End.x][End.y])){
    cout<<"NO"<<endl;
    continue;
    }
    init();
    bfs();
    }
    }
    return 0;
    }

  • 相关阅读:
    Asp.net实现URL重写
    IHttpModule不起作用的两个原因
    从客户端中检测到有潜在危险的 request.form值[解决方法]
    PHP $_SERVER详解
    string.Format 格式化日期格式
    图解正向代理、反向代理、透明代理
    Javacard 解释器怎样在API类库中找到源文件调用的类、方法或者静态域?
    API
    指令集
    机器码与字节码
  • 原文地址:https://www.cnblogs.com/cbyniypeu/p/3519822.html
Copyright © 2020-2023  润新知