zoukankan      html  css  js  c++  java
  • hdu2612 Find a way

    广搜两遍找出Y和M到每个KFC的最短距离,然后找一个和最小的输出……

    本来打算两个人一起走,碰头就输出。

    结果发现如果最短距离的KFC离某一个人很近,但离另一个很远,而又有一个KFC在两人之间的时候,答案就不对了。

    结果只能用这种笨办法了。

    #include <stdio.h>
    #include
    <string.h>
    #define INF 9999
    typedef
    struct{
    int x,y,t;
    }QUEUE;
    char map[203][203];
    const int dirc[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};
    int n,m,yVisit[203][203],mVisit[203][203];
    QUEUE q1[
    80000],q2[80000];

    int logic(int x, int y){
    return (x>=0&&y>=0&&x<n&&y<m&&map[x][y]!='#');
    }
    int bfs(int yStrX, int yStrY, int mStrX, int mStrY){
    int yTop,yTail,mTop,mTail,yTime,mTime,i;
    int yNextX,yNextY,yNextTime,mNextX,mNextY,mNextTime;
    yTop
    = yTail = mTop = mTail = 0;
    q1[yTail].x
    = yStrX;
    q1[yTail].y
    = yStrY;
    q1[yTail
    ++].t = 0;
    yVisit[yStrX][yStrY]
    = 1;
    q2[mTail].x
    = mStrX;
    q2[mTail].y
    = mStrY;
    q2[mTail
    ++].t = 0;
    mVisit[mStrX][mStrY]
    = 1;
    while(yTop < yTail || mTop < mTail){
    if(yTop < yTail){
    yStrX
    = q1[yTop].x;
    yStrY
    = q1[yTop].y;
    yTime
    = q1[yTop++].t;
    for(i = 0; i < 4; i++){
    yNextX
    = yStrX + dirc[i][0];
    yNextY
    = yStrY + dirc[i][1];
    yNextTime
    = yTime + 1;
    if(logic(yNextX,yNextY) && !yVisit[yNextX][yNextY]){
    yVisit[yNextX][yNextY]
    = yNextTime;
    q1[yTail].x
    = yNextX;
    q1[yTail].y
    = yNextY;
    q1[yTail
    ++].t = yNextTime;
    }
    }
    }
    if(mTop < mTail){
    mStrX
    = q2[mTop].x;
    mStrY
    = q2[mTop].y;
    mTime
    = q2[mTop++].t;
    for(i = 0; i < 4; i++){
    mNextX
    = mStrX + dirc[i][0];
    mNextY
    = mStrY + dirc[i][1];
    mNextTime
    = mTime + 1;
    if(logic(mNextX,mNextY) && !mVisit[mNextX][mNextY]){
    mVisit[mNextX][mNextY]
    = mNextTime;
    q2[mTail].x
    = mNextX;
    q2[mTail].y
    = mNextY;
    q2[mTail
    ++].t = mNextTime;
    }
    }
    }
    }
    return 0;
    }
    int main (void){
    int i,j,yStrX,yStrY,mStrX,mStrY,min;
    while(~scanf("%d%d",&n,&m)){
    getchar();
    memset(yVisit,
    0,sizeof(yVisit));
    memset(mVisit,
    0,sizeof(mVisit));
    for(i = 0; i < n; i++){
    gets(map[i]);
    for(j = 0; j < m; j++){
    if(map[i][j] == 'Y'){
    yStrX
    = i;
    yStrY
    = j;
    }
    else if(map[i][j] == 'M'){
    mStrX
    = i;
    mStrY
    = j;
    }
    }
    }
    bfs(yStrX,yStrY,mStrX,mStrY);
    min
    = INF;
    for(i = 0; i < n; i++)
    for(j = 0; j < m; j++){
    if(map[i][j] == '@' && yVisit[i][j] && mVisit[i][j])
    if(min > yVisit[i][j] + mVisit[i][j])
    min
    = yVisit[i][j] + mVisit[i][j];
    }
    printf(
    "%d\n",min * 11);
    }
    return 0;
    }

  • 相关阅读:
    排序算法最强总结及其代码实现
    程序员面试常问的小算法总结
    Docker部署Scrapy-redis分布式爬虫框架(整合Selenium+Headless Chrome网页渲染)
    使用亚马逊AWS云服务器进行深度学习——免环境配置/GPU支持/Keras/TensorFlow/OpenCV
    阿里巴巴MySQL开源中间件Canal入门
    【秒杀系统】秒杀系统实战(四)| 缓存与数据库双写一致性实战
    【秒杀系统】秒杀系统实战(五)| 如何优雅的完成订单异步处理
    把购买数据添加到购物车
    实现自动登陆和记住用户名功能
    自定义登陆标签
  • 原文地址:https://www.cnblogs.com/deadblue/p/2041254.html
Copyright © 2011-2022 走看看