标签:
样例输入1
3 3
.*.
...
...
样例输入2
3 3
.**
***
**.
样例输入1
4
样例输入2
no
每个点存两个状态:用过飘飘神功和没有用过。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 }
标签:
原文地址:http://www.cnblogs.com/SilverNebula/p/5789049.html