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