提交前忘记去掉freopen,为这个调试了整整一上午...
下午继续提交,老是超时,把所有STL元素都去掉之后,不超时了,不仅不超时,还快得一匹...
再精简一下代码就行了,刷题一时爽,一直刷一直爽
试题编号: | 201312-5 |
试题名称: | I’m stuck! |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思: 输入格式 输入的第一行包括两个整数R 和C,分别表示地图的行和列数。(1 ≤ R, C ≤ 50)。 输出格式 如果玩家在初始位置就已经不能到达终点了,就输出“I'm stuck!”(不含双引号)。否则的话,输出满足性质的方格的个数。 样例输入 5 5 样例输出 2 样例说明 如果把满足性质的方格在地图上用'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;
}