有吃的!

妇添小有一个很厉害的技能:发现吃的!如果有好吃的东西,不论多远,只要一闻就能知道在哪里。这天他刚刚在程设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 2000

int 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;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值