这一题,简单的广搜或者深搜都可以搞定,时间复杂度都差不多。
我用的是广搜。题目的意思是:@是一个人的起始位置,#不可以走,. 可以走,求出可以走的位置的个数。
一开始没有用结构体来存储坐标,直接用的是z = x * 10 + y;将z入队,结果错了,原因是在取余整除的时候会出错。改用结构体就OK了。
下面是AC的代码:
#include <iostream> #include <queue> #include <cstdio> using namespace std; class data { public: int x, y; }; char map[25][25]; int W, H; int start_x, start_y; int xy[4][2] = {{1,0},{-1,0},{0,1},{0,-1}}; int bfs() { int ans = 0; queue <data> Que; data tem; tem.x = start_x; tem.y = start_y; map[start_x][start_y] = '#'; Que.push(tem); while(!Que.empty()) { tem = Que.front(); Que.pop(); ans++; data temp; for(int i = 0; i < 4; i++) { temp.x = tem.x + xy[i][0]; temp.y = tem.y + xy[i][1]; if(temp.x >= 0 && temp.x < H && temp.y >= 0 && temp.y < W && map[temp.x][temp.y] == '.') { map[temp.x][temp.y] = '#'; Que.push(temp); } } } return ans; } int main() { // freopen("data.txt", "r", stdin); while(scanf("%d%d", &W, &H) != EOF) { getchar(); if(W == 0 && H == 0) break; for(int i = 0; i < H; i++) { for(int j = 0; j < W; j++) { scanf("%c", &map[i][j]); if(map[i][j] == '@') { start_x = i; start_y = j; } } getchar(); } int ans = bfs(); printf("%d\n", ans); } return 0; }
原文地址:http://blog.csdn.net/qq_25425023/article/details/45898327