P1143 飘飘乎居士的约会

P1143 飘飘乎居士的约会

时间: 1000ms / 空间: 131072KiB / Java类名: Main

背景

一阵狂风吹过 
 只听“pong”的一声,飘飘乎居士降落了!!!

描述

又是美妙的一天,这天飘飘乎居士要和MM约会,因此他打扮的格外帅气。但是,因为打扮的时间花了太久,离约会的时间已经所剩无几。
幸运的是,现在飘飘乎居士得到了一张n*m的地图,图中左上角是飘飘乎居士的位置,右下角是约会的地点。‘.’代表马路,‘*’代表房屋。飘飘乎居士只能沿着‘.’行走(也就是不能踏入‘*’),而且行走的方向只能为上下左右的相邻格子。为了不让MM等待太久,飘飘乎居士在整个过程中可能会使用一次飘飘神功(也可能不使用,但最多使用一次),使用飘飘神功后,飘飘乎居士可以走进房屋一次(也就是在全程的行走中最多可以走一个‘*’,注意,只有一个);
   现在飘飘乎居士想要知道最少需要走多少步,飘飘乎居士才能到达约会的地点。

输入格式

第一行,2个正整数 n和m,表示一个n*m的矩阵
     接下来n行,每行m个字符,字符一定为 ’.’ 或者是‘*’ ,分别代表马路和房屋。
     输入数据保证左上角和右下角都为‘.’

输出格式

一行,如果可以到达,则输入需要行走的最少步数(飘飘神功也记为一步)
            如果不可以到达,则输出‘no’

测试样例1

输入

样例输入1 
3 3 
.*. 
... 
...

样例输入2 
3 3 
.** 
*** 
**.

输出

样例输入1 
4

样例输入2 
no

备注

0<N M <=1000飘飘乎居士——violet hill

每个点存两个状态:用过飘飘神功和没有用过。BFS第一次搜到终点的解就是最优解。

因为队列数组开小RE了一个点,差点1A

 1 /*by SilverN*/
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 using namespace std;
 8 const int mxn=1010;
 9 int mx[5]={0,0,1,0,-1},
10     my[5]={0,1,0,-1,0};
11 int n,m;
12 int mp[mxn][mxn];
13 bool vis[mxn][mxn][2];
14 int qx[mxn*100],qy[mxn*100],flag[mxn*100],dis[mxn*100];
15 int hd=0,tl=1;
16 int mxans=300000;
17 void BFS(){
18     qx[++hd]=1;qy[hd]=1;dis[hd]=0;
19     while(hd<=tl){
20         for(int i=1;i<=4;i++){
21             int nx=qx[hd]+mx[i];
22             int ny=qy[hd]+my[i];
23             int nflag=flag[hd];
24             if(nx==n && ny==m){
25                 mxans=min(mxans,dis[hd]+1);
26                 continue;
27             }
28             if(nx>0 && nx<=n && ny>0 && ny<=m){
29                 if(!mp[nx][ny]){
30                     if(!vis[nx][ny][nflag]){
31                         vis[nx][ny][nflag]=1;
32                         qx[++tl]=nx;
33                         qy[tl]=ny;
34                         flag[tl]=nflag;
35                         dis[tl]=dis[hd]+1;
36                     }
37                 }
38                 else{
39                     if(!nflag){
40                         vis[nx][ny][1]=1;
41                         qx[++tl]=nx;
42                         qy[tl]=ny;
43                         flag[tl]=1;
44                         dis[tl]=dis[hd]+1;
45                     }
46                 }
47             }
48         }
49         hd++;
50     }
51 }
52 int main(){
53     scanf("%d%d",&n,&m);
54     int i,j;
55     char c[1020];
56     for(i=1;i<=n;i++){
57         scanf("%s",c);
58         for(j=1;j<=m;j++)
59             if(c[j-1]==‘*‘)mp[i][j]=1;
60     }
61     BFS();
62     if(mxans==300000)printf("no\n");
63     else printf("%d\n",mxans);
64     return 0;
65 }
时间: 2024-10-07 05:18:23

P1143 飘飘乎居士的约会的相关文章

tyvjP1288 飘飘乎居士取能量块

P1288 飘飘乎居士取能量块 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 9月21日,pink生日:9月22日,lina生日:9月23日,轮到到飘飘乎居士(狂欢吧,(*^__^*) 嘻嘻……). 描述 9月21日,今天是pink的生日,飘飘乎居士当然要去别人的领土大闹一番啦!  为了收集更多的能量到pink家大闹,飘飘乎居士准备从后花园中取出自己多年积攒的p个能量块.后花园一共被划分n个地区,能量块被分散在里面,现在飘飘乎居士拿出地图,发现自己站在

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

tyvj:P1467 通向聚会的道路

背景 Candy住在一个被划分为n个区域的神奇小镇中,其中Candy的家在编号为n的区域,Candy生日这天,大家都急急忙忙赶去Candy家庆祝Candy的生日. 描述 Candy共有t个朋友住在不同的区域.小镇有m条道路,小镇的神奇之处在于其中的p1条道路只会在你走过区域的的个数为奇数时候开启,p2道路只会在你走过区域的个数为偶数的时候开启,剩下的道路一直都会开启.并且,所有的道路只能够单向通过.飘飘乎居士希望知道在所有的好朋友中,谁离Candy最近?. 输入格式 第一行:两个正整数n m,表

tyvj1467 通向聚会的道路

背景 Candy住在一个被划分为n个区域的神奇小镇中,其中Candy的家在编号为n的区域,Candy生日这天,大家都急急忙忙赶去Candy家庆祝Candy的生日. 描述 Candy共有t个朋友住在不同的区域.小镇有m条道路,小镇的神奇之处在于其中的p1条道路只会在你走过区域的的个数为奇数时候开启,p2道路只会在你走过区域的个数为偶数的时候开启,剩下的道路一直都会开启.并且,所有的道路只能够单向通过.飘飘乎居士希望知道在所有的好朋友中,谁离Candy最近?. 输入格式 第一行:两个正整数n m,表

tyvj1161聚会的名单(trie树)

背景 Background 明天就是candy的生日,candy又会邀请自己的一大堆好友来聚会了!哎!又要累坏飘飘乎居士了!! 描述 Description 明天就是candy的生日.晚上,candy找到了飘飘乎居士.她给了飘飘乎居士一张名单,名单上记录了n个candy的好朋友.可是,飘飘乎居士发现,名单上有好多重复的名字啊,这可急坏了飘飘乎居士.所幸,飘飘乎居士找到了自己的oi朋友,希望能够帮助自己.飘飘乎居士会问某个名字,而你要做的任务就是计算出名单中出现了几次该名字. 题解: trie模板

【TYVJ】1467 - 通向聚会的道路(spfa+特殊的技巧)

http://tyvj.cn/Problem_Show.aspx?id=1467 这题我并不是看题解a的.但是确实从题解得到了启发. 一开始我就想到一个正解,设d[i][0]表示i开始走过奇数个点的最短路,d[i][1]表示i走过偶数个点的最短路,那么转移很简单 d[v][1]=min(d[v][1], d[u][0]+w(u, v)) 当(u, v)是奇数才能走的边 d[v][0]=min(d[v][0], d[u][1]+w(u, v)) 当(u, v)是偶数才能走的边 然后每一个人都跑一次

TYVJ博弈论

一些比较水的博弈论...(为什么都没有用到那什么SG呢....) TYVJ 1140  飘飘乎居士拯救MM 题解: 歌德巴赫猜想 1 #include <cmath> 2 #include <cstdio> 3 4 int n, a, b, ta, tb; 5 6 inline bool isPrime(int x){ 7 if (x==1) return true; 8 for (int i=2; i<=sqrt(x); i++) 9 if (!(x%i)) return

[JOYOI1468] 清理垃圾 - DP

题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Local 题目背景 聚会结束,留下许多垃圾.Candy:“好多垃圾啊,飘飘乎居士,我们一起处理垃圾吧!” 题目描述 Candy家里总共有n个垃圾等待处理,每个垃圾对于Candy和飘飘乎居士处理的时间都是不同的,而且每个垃圾只需要一个人处理.当然,Candy和飘飘乎居士可以同时处理不同的垃圾.记两人中耗费最长时间为最后总时间.Candy希望能够尽快的处理完所有的垃圾,因此,他想要知道处理完这些垃圾最少

java小题:福尔摩斯的约会

原题地址:https://www.nowcoder.com/pat/6/problem/4040 防止广告嫌疑,原题为: 题目描述 大侦探福尔摩斯接到一张奇怪的字条:"我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm".大侦探很 快就明白了,字条上奇怪的乱码实际上就是约会的时间"星期四 14:04",因为前面两字符串中第1对相同的大写英文字母(大小写有区分)是 第4个字母'D',