CCFCSP-201312-5-I’m stuck!

版权声明:欢迎读者提问交流。 个人水平有限,表述不当或疏漏之处敬请批评指正。 作者:trialley 来源:CSDN 著作权归作者所有。非商业转载请注明出处,商业转载请联系作者获得授权。 https://blog.csdn.net/lgfx21/article/details/89296191

提交前忘记去掉freopen,为这个调试了整整一上午...

下午继续提交,老是超时,把所有STL元素都去掉之后,不超时了,不仅不超时,还快得一匹...

再精简一下代码就行了,刷题一时爽,一直刷一直爽

试题编号: 201312-5
试题名称: I’m stuck!
时间限制: 1.0s
内存限制: 256.0MB
问题描述:

问题描述

  给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思:
  '#': 任何时候玩家都不能移动到此方格;
  '+': 当玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格;
  '-': 当玩家到达这一方格后,下一步可以向左右两个方向相邻的一个非'#'方格移动一格;
  '|': 当玩家到达这一方格后,下一步可以向上下两个方向相邻的一个非'#'方格移动一格;
  '.': 当玩家到达这一方格后,下一步只能向下移动一格。如果下面相邻的方格为'#',则玩家不能再移动;
  'S': 玩家的初始位置,地图中只会有一个初始位置。玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格;
  'T': 玩家的目标位置,地图中只会有一个目标位置。玩家到达这一方格后,可以选择完成任务,也可以选择不完成任务继续移动。如果继续移动下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格。
  此外,玩家不能移动出地图。
  请找出满足下面两个性质的方格个数:
  1. 玩家可以从初始位置移动到此方格;
  2. 玩家可以从此方格移动到目标位置。

输入格式

  输入的第一行包括两个整数R 和C,分别表示地图的行和列数。(1 ≤ R, C ≤ 50)。
  接下来的R行每行都包含C个字符。它们表示地图的格子。地图上恰好有一个'S'和一个'T'。

输出格式

  如果玩家在初始位置就已经不能到达终点了,就输出“I'm stuck!”(不含双引号)。否则的话,输出满足性质的方格的个数。

样例输入

5 5
--+-+
..|#.
..|##
S-+-T
####.

样例输出

2

样例说明

  如果把满足性质的方格在地图上用'X'标记出来的话,地图如下所示:
  --+-+
  ..|#X
  ..|##
  S-+-T
  ####X

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath> 
#include<string>
#include<cstring>
#include<vector>
#include<map>
#include<set>
using namespace std;

void down();
void up();
void left();
void right();
struct node;
typedef struct link {
	link* next;
	node* position;
} link;

typedef struct node {
	char value;
	char i, j;
	link* link;
} node;
node* start;

template<class T>
struct queue {
	int l = 0;
	int r = 0;
	T a [ 100000 ] ;
	void push(T x) {
		a[r] = x;
		r=r+1;
	}
	T front() {
		return a[l];
	}
	void pop() {
		if(l<r)l++;
	}
	bool empty() {
		if (l == r) 
			return true;
		return false;
	}
};

template<class T>
struct stack {
	int a[25536];
	int l = 0;
	void push(T x) {
		a[l] = x;
		l++;
	}
	T front() {
		return a[l-1];
	}
	void pop() {
		if(l>0)l--;
	}
	bool empty() {
		if (l > 0)return false;
		return true;
	}
};


node* endposition;
node a[50][50];
int i, j;
node* head;
int r, c;
link* templink;
bool bfs(node* start,char ch);
int main() {

	freopen("in.txt", "r", stdin);

	scanf("%d%d", &r, &c);
	for (i = 0; i < r; i++) {
		char tempc;
		scanf("%c", &tempc);
		for (j = 0; j < c;j++) {
			scanf("%c", &a[i][j].value);
			a[i][j].i = i;
			a[i][j].j = j;
			a[i][j].link = new link;
			templink = a[i][j].link;
			templink->position = NULL;
			templink->next = NULL;
			if (a[i][j].value == '#') {
			}
			if (a[i][j].value == '|') {
				down();
				up();
			}
			if (a[i][j].value == '-') {
				left();
				right();
			}
			if (a[i][j].value == '+') {
				down();
				up();
				left();
				right();
			}
			if (a[i][j].value == 'S') {
				down();
				up();
				left();
				right();
				start = &a[i][j];
			}
			if (a[i][j].value == 'T') {
				down();
				up();
				left();
				right();
				endposition = &a[i][j];
			}
			if (a[i][j].value == '.') {
				down();
			}
		}
	}

	if (bfs(start,'T') == false) {
		printf("I'm stuck!");
		return 0;
	}
	else {
		int X=0;
		for (i = 0; i < r; i++) {
			for (j = 0; j < c; j++) {
				bool iswalk;

				if (bfs(&a[i][j],'T') == false) {
					if (a[i][j].value != '#'&&a[i][j].value != 'T') {
						endposition->value = '+';
						char tempchar = a[i][j].value;
						a[i][j].value = 'T';
						if (bfs(start, 'T') == true)X++;
						endposition->value = 'T';
						a[i][j].value = tempchar;
					}
				}
			}
		}
		printf("%d", X);
	}
	return 0;
}

void inline down() {

	if (i + 1 < r&& a[i + 1][j].value != '#') {
		templink->next = new link;
		templink = templink->next;
		templink->position=&a[i + 1][j];
		templink->next = NULL;
	}
	else {
		templink->next = NULL;
	}
}

void inline up() {
	if (i > 0&& a[i - 1][j].value!='#') {
		templink->next = new link;
		templink = templink->next;
		templink->position = &a[i - 1][j];
		templink->next = NULL;
	}
	else {
		templink->next = NULL;
	}
}
void inline right() {
	if (j > 0 && a[i][j-1].value != '#') {
		templink->next = new link;
		templink = templink->next;
		templink->position = &a[i][j - 1];
		templink->next = NULL;
	}
	else {
		templink->next = NULL;
	}
}
void inline left() {
	if (j + 1 < c&& a[i ][j+1].value != '#') {
		templink->next = new link;
		templink = templink->next;templink->position = &a[i][j + 1];
		
		templink->next = NULL;
	}
	else {
		templink->next = NULL;
	}
}

bool inline bfs(node* start,char ch) {
	queue<node* > q;
	q.push(start);
	
	bool visited[50][50] = { 0 };

	node* head = start;
	visited[head->i][head->j] = true;


	while (!q.empty()) {
		head = q.front();
		q.pop();

		link* templink = head->link->next;
		while (templink) {
			if (visited[templink->position->i][templink->position->j] == 0) {
				if (templink->position->value == ch) {
					return true;
				}
				visited[templink->position->i][templink->position->j] = 1;

				q.push(templink->position);

				
			}templink = templink->next;
		}
	}

	return false;
}

猜你喜欢

转载自blog.csdn.net/lgfx21/article/details/89296191