题目意思简单:)一个人(用@表示)可以走黑块(用.表示)不能走红块(用#表示)。给你m*n的地图,让你求人能走到的砖块个数。
一开始疯狂TLE,疯了都要。优化了几个地方还是不行。然后就伸手向yky爸爸求助:)真的是大爷。指点了我一个if(vis[p.x][p.y]) continue;就A了:)真的恐怖。虽然很不好意思但以后还是多向爸爸求助。
#include <cstdio>
#include <queue>
using namespace std;
struct node {
int x, y, pre;
node() {
x = 0;
y = 0;
pre = 0;
}
};
queue <node> Q;
int n, m, map[30][30], ans, PRE;
bool vis[30][30];
char _;
int main() {
while(1) {
scanf("%d%d", &n, &m);
if(n == 0 && m == 0)
break;
ans = 0;
_ = getchar();
node sta, p;
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n; j++) {
vis[i][j] = false;
scanf("%c", &_);
if(_ == '.')
map[i][j] = 1;
else if(_ == '#')
map[i][j] = 0;
else if(_ == '@') {
sta.x = i;
sta.y = j;
}
if(j == n)
scanf("%c", &_);
}
Q.push(sta);
while(!Q.empty()) {
p = Q.front();
Q.pop();
if(vis[p.x][p.y])
continue;
vis[p.x][p.y] = true;
PRE = p.pre;
if(map[p.x + 1][p.y] && p.x + 1 <= m && !vis[p.x + 1][p.y] && p.pre != 1) {
p.x++;
p.pre = 2;
Q.push(p);
p.x--;
p.pre = PRE;
}
if(map[p.x - 1][p.y] && p.x > 1 && !vis[p.x - 1][p.y] && p.pre != 2) {
p.x--;
p.pre = 1;
Q.push(p);
p.x++;
p.pre = PRE;
}
if(map[p.x][p.y + 1] && p.y + 1 <= n && !vis[p.x][p.y + 1] && p.pre != 3) {
p.y++;
p.pre = 4;
Q.push(p);
p.y--;
p.pre = PRE;
}
if(map[p.x][p.y - 1] && p.y > 1 && !vis[p.x][p.y - 1] && p.pre != 4) {
p.y--;
p.pre = 3;
Q.push(p);
p.y++;
p.pre = PRE;
}
}
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n; j++)
if(vis[i][j])
ans++;
printf("%d\n", ans);
}
return 0;
}