HDU 4255 (筛素数+BFS寻最短路径长度)

2 篇文章 0 订阅
1 篇文章 0 订阅

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4255

本题有一个小trick,虽说给定的数的范围是[1,10000],但有可能存在一条绕出100*100的矩阵(包含1-10000的数的矩阵)的从起点到达终点的路径,比完全位于100*100矩阵(包含1-10000的数的矩阵)当中的从起点到达终点的最短路径的长度还要短,于是,便要扩大矩阵,为特殊情况的搜索另外开辟一条路。


#include <cstdio>
#define ny i+dy[(dir+k)%4]
#define nx j+dx[(dir+k)%4]

const int N = 106;
const int M = 13000;
const int inf = (int)1e9;
const int dx[4] = {0, 1, 0, -1}; // 0 down 1 right 2 up 3 left
const int dy[4] = {1, 0, -1, 0};

int a[N][N];
int dist[N][N];
int x[M], y[M];
int prm[M>>1], pn;
bool np[M];

void getprm()
{
    np[0] = np[1] = true;
    pn = 0;
    prm[pn++] = 2;
    for(int i=2; i<M; i++) {
        if(!np[i]) prm[pn++] = i;
        for(int j=0; j<pn; j++) {
            if(i*prm[j] >= M) break;
            np[i*prm[j]] = true;
            if(i%prm[j] == 0) break;
        }
    }
}

int main()
{
    getprm();
    int flag = 1;
    for(int i=0; i<N; i++) {
        for(int j=0; j<N; j++) a[i][j] = inf;
    }
    int dir = 0;
    a[N/2][N/2-1] = 1;
    int b = 2;
    int i = N/2, j = N/2-1;
    while(flag) {
        flag = 0;
        for(int k=1; k>=0; k--) {
            if(ny>=0 && nx>=0 && nx<N && ny<N) {
                if(a[ny][nx] == inf) {
                    a[ny][nx] = b++;
                    i = ny, j = nx;
                    dir = (dir+k)%4;
                    flag = 1;
                    break;
                }
            }
        }
        if(!flag) break;
    }
    int xxx, yyy, num = 1, xi, xj, vi, vj;
    while(~scanf("%d%d", &xxx, &yyy)) {
        printf("Case %d: ", num);
        num++;
        for(int i=0; i<N; i++) {
            for(int j=0; j<N; j++) {
                if(a[i][j] == xxx) {
                    xi = i, xj = j;
                    dist[i][j] = 0;
                }
                else {
                    if(a[i][j] == yyy) {
                        vi = i, vj = j;
                    }
                    dist[i][j] = inf;
                }
            }
        }
        y[1] = xi, x[1] = xj;
        int b=1, e=1, flag1 = 0;
        while(b <= e) {
            for(int j=0; j<4; j++) {
                int xk = x[b] + dx[j];
                int yk = y[b] + dy[j];
                if(xk>=0 && yk>=0 && xk<N && yk<N) {
                    if(np[a[yk][xk]] && dist[yk][xk] == inf) {
                        e++;
                        x[e] = xk;
                        y[e] = yk;
                        dist[yk][xk] = dist[y[b]][x[b]] + 1;
                        if(yk == vi && xk == vj) { flag1 = 1; break; }
                    }
                }
            }
            if(flag1) break;
            b++;
        }
        if(dist[vi][vj] == inf) printf("impossible\n");
        else printf("%d\n", dist[vi][vj]);
    }
    return 0;
}


基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip 个人大四的毕业设计、课程设计、作业、经导师指导并认可通过的高分设计项目,评审平均分达96.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 [资源说明] 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设或者课设、作业,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96.5分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),供学习参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值