• hdu_4255


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

    这题还是很有意思的

    打了两个表

    一个是矩阵的

    一个是素数表

    然后直接BFS

    不过好多天没写ACM题

    今天手感实在是不行啊。。。弱爆了

    这题唯一有问题的就是可能存在一条路,这条路经过大于1W数字的点了

    标程提供的是200*200

    DHT大神给我讲了之后,他说用400*400,然后一改就过了。。跪到惨了

    今天还遇到个写文件 的问题,真心不解,下次再碰到就好好研究吧,还是赶紧去做信安大赛吧

    #include<cstdio>
    #include<queue>
    #include<cstring>
    using namespace std;
    struct point{
        int x, y;
        int step;
    };
    
    struct MAP{
        int x, y;
    }Map[160010];
    int map[410][410];
    void init(){
        Map[160000].x = Map[160000].y = 1;
        map[1][1] = 160000;
        int n = 159999;
        //while()
        int row = 399;
        int m = 200;
        int x = 1, y = 1;
        while(m --){
            for(int i = 0 ; i < row; i ++){
                y  ++;
                Map[n].x = x, Map[n].y = y;
                map[x][y] = n;
                n--;
            }
            for(int i = 0 ; i < row; i ++){
                x  ++;
                Map[n].x = x, Map[n].y = y;
                map[x][y] = n;
                n--;
            }
            for(int i = 0 ; i < row; i ++){
                y  --;
                Map[n].x = x, Map[n].y = y;
                map[x][y] = n;
                n--;
            }
            for(int i = 0 ; i < row-1; i ++){
                x --;
                Map[n].x = x, Map[n].y = y;
                map[x][y] = n;
                n--;
            }
            row -= 2;
            y ++;
            Map[n].x = x, Map[n].y = y;
            map[x][y] = n;
            n --;
        }
        map[201][201] = 2;
        Map[2].x = 201, Map[2].y = 201;
        /*
        //printf("------%d   %d\n", Map[1].x,Map[1].y);
        printf("++++  %d\n", map[94][94]);
        for(int i = 93; i <= 100; i ++)
        {
            for(int j = 1; j <= 100; j ++)
            {
                //if(map[i][j] == 0)puts("asf");
                printf("%d ", map[i][j]);
            }
            puts("");
        }
        */
    }
    const int maxn = 160000 + 10;
    bool IsNotPrime[maxn]; // 判断是否为素数.
    int PrimeList[maxn]; // 素数列表.
    int PrimeNum;
    
    void Prime_Linear()
    { // 速度比朴素筛法快2倍以上,该筛法进行稍微修改即可用于求欧拉函数Phi[].
        int i, j;
        memset(IsNotPrime, 0, sizeof(IsNotPrime)); // 初始赋值所有数都是素数.
        IsNotPrime[1] = 1; IsNotPrime[0] = 1; // 0和1不是素数.
        PrimeList[0]=2;
        for (i = 4; i < maxn; i += 2) IsNotPrime[i] = 1; // 除2以外的所有偶数都不是素数.
        PrimeNum = 1;
        for (i = 3; i < maxn; i += 2)
        {
            if (!IsNotPrime[i])
            { // 如果是素数则加入素数列表.
                PrimeList[PrimeNum++] = i;
            }
            // 注意:这里与朴素筛法不同,即使合数也要进行筛.
            // 因为这里素数只筛它的素数倍,那么有些合数就可能没被筛掉.
            // 而这些合数就需要合数来晒,而且只要筛到它的最小质因子倍即可(想想为什么?).
            for (j = 0; j < PrimeNum && i * PrimeList[j] < maxn; j++)
            {
                IsNotPrime[i * PrimeList[j]] = 1;
                if (i % PrimeList[j] == 0)
                { // 说明PrimeList[j]是i的最小质因子,即i * PrimeList[j]的最小质因子,则跳出.
                    break;
                }
            }
        }
    }
    int dir[4][2] = {-1,0,1,0,0,-1,0,1};
    bool flag[410][410];
    int bfs(point start, point end){
        queue < point > q;
        q.push(start);
        while(!q.empty()){
            point tmp = q.front();
            q.pop();
            for(int i = 0; i < 4; i ++){
                int x = tmp.x + dir[i][0];
                int y = tmp.y + dir[i][1];
                if(x == end.x && y == end.y ){
                    return tmp.step+1;
                }
                if(x < 1 || y < 1 || x > 400 || y > 400)continue;
                if(flag[x][y] == 1) continue;
                //intf("--%d\n", map[x][y]);
                if(IsNotPrime[ map[x][y] ] == 0)continue;
                point now;
                now.x = x;
                now.y = y;
                now.step = tmp.step + 1;
                q.push(now);
                flag[now.x][now.y] = 1;
            }
        }
        return 0;
    }
    
    int main(){
       // freopen("c:\\12.txt","w",stdout);
        init();
        Prime_Linear();
        int z = 1;
        int x, y;
        while(~scanf("%d%d", &x, &y)){
            memset(flag, 0, sizeof(flag));
            point start, end;
            start.x = Map[x].x;
            start.y = Map[x].y;
            start.step = 0;
            flag[start.x][start.y] = 1;
            end.x = Map[y].x;
            end.y = Map[y].y;
            int f = bfs(start, end);
            printf("Case %d: ", z ++);
            if(f != 0)
            printf("%d\n", f);
            else
            puts("impossible");
        }
        return 0;
    }
  • 相关阅读:
    C++ 遍历文件
    C++ struct
    C++动态数组
    C++ 常量指针和矩阵
    imfilter与fspecial
    空间域图像增强:卷积和空间域滤波
    数字图像处理-图像的几何变换(一)
    多线程中的生产者消费者问题
    使用Netty进行Android与Server端通信实现文字发送接收与图片上传
    C# FileSystemWatcher 监视磁盘文件变更
  • 原文地址:https://www.cnblogs.com/louzhang/p/2594323.html
Copyright © 2020-2023  润新知