zoukankan      html  css  js  c++  java
  • hdu 1195 Open the Lock

    http://acm.hdu.edu.cn/showproblem.php?pid=1195


    这个题广搜,不过我开始写的超内存了,估计是广搜队列太长了。
    然后借鉴了别人的代码来AC。。但是有一点没想通,不就是循环范围改了一下,为什么内存差别这么大。无语。。

    一开始超内存代码:
    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<cstring>
    
    using namespace std;
    
    struct Node
    {
        int nu[4];  //记录四个位置的密码值
        int sum;
    }p;
    
    int lock[10][10][10][10];  //判重记录
    int pas[4];                //记录最后的密码
    int a,b,c,d;
    
    void Bfs()
    {
        queue<Node> q;
        Node now,next;
        int i;
        int exchange;
        q.push(p);
        while(!q.empty())
        {
            now = q.front();
            q.pop();
            for(i = 0; i < 4; i++)          //判断密码是否正确
            {
                if(now.nu[i] != pas[i])
                {
                    break;
                }
            }
            if(i == 4)
            {
                printf("%d
    ",now.sum);
                break;
            }
            for(i = 0; i < 4; i++)         //每个循环只操作一次
            {
                next = now;
                next.sum++;
    
                next.nu[i] = now.nu[i]+1;   //第i个数增加一
                if(next.nu[i] > 9)
                {
                    next.nu[i] = 1;
                }
                if(lock[next.nu[0]][next.nu[1]][next.nu[2]][next.nu[3]] == 0)  //如果没有经过则入队
                {
                    lock[next.nu[0]][next.nu[1]][next.nu[2]][next.nu[3]] = 1;
                    q.push(next);
                }
    
                next.nu[i] = now.nu[i]-1;   //减少一
                if(next.nu[i] < 1)
                {
                    next.nu[i] = 9;
                }
                if(lock[next.nu[0]][next.nu[1]][next.nu[2]][next.nu[3]] == 0)
                {
                    lock[next.nu[0]][next.nu[1]][next.nu[2]][next.nu[3]] = 1;
                    q.push(next);
                }
    
                if(i<3)                    //两个数交换
                {
                    next = now;
                    nex.sum++;
                    exchange = next.nu[i];
                    next.nu[i] = next.nu[i+1];
                    next.nu[i+1] = exchange;
                    q.push(next);
                }
            }
        }
    }
    
    int main()
    {
        int t,x;
        scanf("%d",&t);
        while(t--)
        {
            memset(lock,0,sizeof(lock));
            memset(pas,0,sizeof(pas));
            scanf("%d",&x);  //输入当前密码值
            p.nu[3] = a = x%10;
            x = x/10;
            p.nu[2] = b = x%10;
            x = x/10;
            p.nu[1] = c = x%10;
            x = x/10;
            p.nu[0] = d = x;
            lock[d][c][b][a] = 1;
            p.sum = 0;
            scanf("%d",&x);  //输入最终密码
            pas[3] = x%10;
            x = x/10;
            pas[2] = x%10;
            x = x/10;
            pas[1] = x%10;
            x = x/10;
            pas[0] = x;
            Bfs();
        }
    
        return 0;
    }
    

    AC代码:
    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<cstring>
    
    using namespace std;
    
    struct Node
    {
        int nu[4];  //记录四个位置的密码值
        int sum;
    }p;
    
    int lock[10][10][10][10];  //判重记录
    int pas[4];                //记录最后的密码
    int a,b,c,d;
    
    void Bfs()
    {
        queue<Node> q;
        Node now,next;
        int i;
        q.push(p);
        while(!q.empty())
        {
            now = q.front();
            q.pop();
            for(i = 0; i < 4; i++)   //判断密码是否正确
            {
                if(now.nu[i]!=pas[i])
                {
                    break;
                }
            }
            if(i==4)
            {
                printf("%d
    ",now.sum);
                break;
            }
            for(i = 0; i < 4; i++)  //每位加一操作
            {
                next = now;
                next.nu[i] = now.nu[i]+1;
                if(next.nu[i]>9)
                {
                    next.nu[i] = 1;
                }
                if(lock[next.nu[0]][next.nu[1]][next.nu[2]][next.nu[3]]!=1)
                {
                    lock[next.nu[0]][next.nu[1]][next.nu[2]][next.nu[3]]=1; //标记
                    next.sum = now.sum+1;
                    q.push(next);
                }
            }
            for(i = 0; i < 4; i++)  //每位减一操作
            {
                next = now;
                next.nu[i] = now.nu[i]-1;
                if(next.nu[i]<1)
                {
                    next.nu[i] = 9;
                }
                if(lock[next.nu[0]][next.nu[1]][next.nu[2]][next.nu[3]]!=1)
                {
                    lock[next.nu[0]][next.nu[1]][next.nu[2]][next.nu[3]]=1;
                    next.sum = now.sum+1;
                    q.push(next);
                }
            }
            for(i = 0; i < 3; i++)  //相邻的交换
            {
                next = now;
                next.nu[i] = now.nu[i+1];
                next.nu[i+1] = now.nu[i];
                if(lock[next.nu[0]][next.nu[1]][next.nu[2]][next.nu[3]]!=1)
                {
                    lock[next.nu[0]][next.nu[1]][next.nu[2]][next.nu[3]]=1;
                    next.sum = now.sum+1;
                    q.push(next);
                }
            }
        }
    }
    
    int main()
    {
        int t,x;
        scanf("%d",&t);
        while(t--)
        {
            memset(lock,0,sizeof(lock));
            memset(pas,0,sizeof(pas));
            scanf("%d",&x);  //输入当前密码值
            p.nu[3] = a = x%10;
            x = x/10;
            p.nu[2] = b = x%10;
            x = x/10;
            p.nu[1] = c = x%10;
            x = x/10;
            p.nu[0] = d = x;
            lock[d][c][b][a] = 1;
            p.sum = 0;
            scanf("%d",&x);  //输入最终密码
            pas[3] = x%10;
            x = x/10;
            pas[2] = x%10;
            x = x/10;
            pas[1] = x%10;
            x = x/10;
            pas[0] = x;
            Bfs();
        }
    
        return 0;
    }
    


  • 相关阅读:
    hdu1078 记忆化dfs
    hdu1142 dij+记忆化深搜
    UVA 11374 dijkstra预处理+枚举
    poj1502 单源最短路径
    hdu1814 2-SAT 暴力搜
    macos 10.15.1 pip3安装提示权限不足
    将安装器信息下载到目标卷宗失败
    Mac修改默认python版本
    努力吧,少年
    Implement strStr() 字符串匹配
  • 原文地址:https://www.cnblogs.com/pangblog/p/3275777.html
Copyright © 2011-2022 走看看