有吃的!

来源:互联网 发布:淘宝手机城 编辑:程序博客网 时间:2024/04/27 16:52
妇添小有一个很厉害的技能:发现吃的!如果有好吃的东西,不论多远,只要一闻就能知道在哪里。这天他刚刚在程设rejudge完,忽然鼻子一抽——有吃的!他决定马上赶去吃这么好吃的东西。
语文男为了考验妇添小的品味,在路中间放了很多馒头,看他会不会饿的先吃馒头。妇添小当然不会让这种雕虫小计得逞!为了保持自己的品味,他决定绕开所有的馒头。Eureka受到妇添小邀请,运用绝世法力构造了很多传送点,任意两个传送点之间都能瞬移(当然传不传,传到哪里都可以随心所欲)。妇添小每次移动只能走上下左右四个方向(瞬移除外,并且瞬移不耗费时间)。现在,妇添小最短多长时间能吃到好吃的东西呢?
(当然,为了出题我们隐瞒了一些事实:不仅好吃的不见了,路上的馒头竟然也不翼而飞了,这真真是个悲伤的故事T.T)

输入:
第一行包含两个数字n,m(1<=n,m<=2000)
接下来包含n行,每行m个字符,表示现在的地图。'.'表示空地,'M‘表示馒头,‘E’表示传送点,'N'表示妇添小所在的位置,'C'表示吃的。'N'和‘C'在地图中出现且仅出现一次。
输出:

一个数字,表示妇添小最快能多长时间吃到好吃的。如果永远吃不到,只能说明传送点不够多,输出“Bad Eureka”。

#include <stdio.h>#include <stdlib.h>#define N 2000int map[N][N] = {0};typedef struct queue{    int row;    int column;    int step;    struct queue* next;}Queue; // node of queue /** * Args: *    n ---------- map's row-number *    m ---------- map's column-number *    map[N][N] -- map's detail  *    startR ----- person's row-number  *    startC ----- person's column-number  *    targetR ---- target's row-number  *    targetC ---- target's column-number * Return: *    0 ---------- create successfully *    -1 --------- sth. wrong among creating map */int createMap(int& n, int& m, int map[N][N], int& startR, int& startC, int& targetR, int& targetC){ int i = 0, j = 0;    printf("row n and column m:\n");    scanf("%d %d", &n, &m);    getchar();    for(i = 0; i < n; i++){        printf("row %d:\n", i+1);        for(j = 0; j < m; j++){            char ch;            scanf("%c", &ch);            if(ch == '.')                map[i][j] = 1;        else if(ch == 'M')    map[i][j] = -1;            else if(ch == 'C'){                map[i][j] = 3;                targetR = i;                targetC = j;}            else if(ch == 'E')                map[i][j] = 2;            else if(ch == 'N'){                map[i][j] = 4;                startR = i;                startC = j;}            else{ getchar(); printf("invalid input\n");                return -1;}            getchar();        }    }    /* matrix of map    for(int i = 0; i < n; i++){    printf("\n");    for(int j = 0; j < m; j++)        printf("%d ", map[i][j]);    }    printf("\n");    */     return 0;}/** * Args: *    n ---------- map's row-number *    m ---------- map's column-number *    map[N][N] -- map's detail *    dir[4][2] -- 4 direction's: right, left, up, down *    stopFlag --- 0: can't reach to target; 1: reach to 'E'; 2: reach to target 'C'  *    bR --------- BFS Initial Point's row-number *    bC --------- BFS Initial Point's column-number  * Return: *    step ------- step-number */int bfsNtoC(int n, int m, int map[N][N], int dir[4][2], int& stopFlag, int bR, int bC){ int step = 0; Queue* head; head = (Queue*)malloc(sizeof(Queue)); head->row = bR; head->column = bC; head->step = 0; head->next = NULL; Queue* tail = head;  while(head != NULL)    {     for(int i = 0; i < 4; i++)        { int row = head->row + dir[i][0]; int col = head->column + dir[i][1]; if(row < n && row >= 0 && col < m && col >= 0 && map[row][col] > 0)    {                Queue* node = (Queue*)malloc(sizeof(Queue));                node->row = row;                node->column = col;                node->step = head->step + 1;                node->next = NULL;                tail->next = node;                tail = node;                if(map[row][col] == 2)                {        stopFlag = 1;        break;    }    else if(map[row][col] == 3){             stopFlag = 2;             break;         }            }        }        Queue* temp = head;        map[head->row][head->column] = -2;        head = head->next;        free(temp);        if(stopFlag > 0)            break;    }        if(stopFlag == 0)        step = 0;    else        step = tail->step;    while(head != NULL){        Queue* temp = head;        head = temp->next;        free(temp);    }    return step;}int main(){ int n = 0, m = 0, stopFlag = 0, step = 0, startR = 0, startC = 0;    int targetR = 0, targetC = 0, tempFlag = stopFlag; int dir[4][2] = {{0, 1},  // right                     {0, -1}, // left                     {-1, 0}, // up                     {1, 0}   // down    }; if(createMap(n, m, map, startR, startC, targetR, targetC) == 0)    {     step = bfsNtoC(n, m, map, dir, stopFlag, startR, startC);     tempFlag = stopFlag;     stopFlag = 0;     if(tempFlag == 0)         printf("Bad Eureka\n");        else if(tempFlag == 2)            printf("%d\n", step);        else if(tempFlag == 1)            printf("%d\n", step+bfsNtoC(n, m, map, dir, stopFlag, targetR, targetC));    } // else error system("PAUSE"); return 0;}


0 0
原创粉丝点击