洛谷 P1683 入门
题目描述
不是任何人都可以进入桃花岛的,黄药师最讨厌象郭靖一样呆头呆脑的人。所以,他在桃花岛的唯一入口处修了一条小路,这条小路全部用正方形瓷砖铺设而成。有的瓷砖可以踩,我们认为是安全的,而有的瓷砖一踩上去就会有喷出要命的毒气,那你就死翘翘了,我们认为是不安全的。你只能从一块安全的瓷砖上走到与他相邻的四块瓷砖中的任何一个上,但它也必须是安全的才行。
由于你是黄蓉的朋友,她事先告诉你哪些砖是安全的、哪些砖是不安全的,并且她会指引你飞到第1块砖上(第1块砖可能在任意安全位置),现在她告诉你进入桃花岛的秘密就是:如果你能走过最多的瓷砖并且没有死,那么桃花岛的大门就会自动打开了,你就可以从当前位置直接飞进大门了。
注意:瓷砖可以重复走过,但不能重复计数。
输入输出格式
输入格式:
第1行两个正整数W和H,分别表示小路的宽度W和长度H,W和H都不大于20。
以下H行为一个H*W的字符矩阵。每一个字符代表一块瓷砖。其中,“.”代表安全的砖,“#”代表不安全的砖,“@”代表第1块砖。
【输出格式】
输出格式:
输出一行,只包括一个数,即你从第1块砖开始所能安全走过的最多的砖块个数(包括第1块砖)。
输入输出样例
输入样例#1: 复制
11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ...........
输出样例#1: 复制
59
考察算法:搜索 难度:普及- (突然发现我最近都在做这个难度的题qwq)
思路:记录起点‘@’的位置开始搜(Although这种题一般用广搜(BFS),我比较喜欢用深搜(DFS))
代码:
//广搜代码
#include<iostream> #include<cmath> #include<string> #include<queue> #define maxn 25 using namespace std; int w, h, fx, fy; bool map[maxn][maxn]; bool visited[maxn][maxn]; int ans = 0; typedef pair<int, int> point; int main() { cin >> w >> h; string str; for(int i = 1; i <= h; ++i) { cin >> str; for(int j = 1; j <= w; ++j) { if(str[j-1] == '.') map[i][j] = true; else if(str[j-1] == '@') fx = i, fy = j; } } queue<point> q; q.push(make_pair(fx, fy)); while(!q.empty()) { point p = q.front(); q.pop(); int x = p.first, y = p.second; if(visited[x][y]) continue; visited[x][y] = true; ans++; if(x-1>=0 && !visited[x-1][y] && map[x-1][y]) q.push(make_pair(x-1, y)); if(y-1>=0 && !visited[x][y-1] && map[x][y-1]) q.push(make_pair(x, y-1)); if(y+1<=w && !visited[x][y+1] && map[x][y+1]) q.push(make_pair(x, y+1)); if(x+1<=h && !visited[x+1][y] && map[x+1][y]) q.push(make_pair(x+1, y)); } cout << ans << endl; return 0; }