标签:des style blog http color os io for
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1124
4 4 2 PLLP PPLP PPPP PLLP
5
我的搜索学的很烂,这题就是一个简单地三维bfs,但拿道题却感到无从下手。搜索的题需要狠狠加强。
bfs中每步都要搜索所有能走的地方,例如这题第一步搜索,上下左右,2~d*上下左右.这是算法的核心。
其他部分都是围绕算法的核心进行。
#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> using namespace std; char map[101][101]; int v[101][101][101]; int n,m,d; struct node { int x,y,z; int ans; }q[1000001]; int jx[]={1,-1,0,0}; int jy[]={0,0,1,-1}; void bfs() { memset(v,0,sizeof(v)); int e=0; int s=0; struct node t,f; t.x=0; t.y=0; t.z=d; t.ans=0; v[t.x][t.y][t.z]=1; q[e++]=t; while(s<e) { t=q[s++]; if(t.x==n-1&&t.y==m-1) { printf("%d\n",t.ans); return ; } for(int i=0;i<4;i++) { f.x=t.x+jx[i]; f.y=t.y+jy[i]; if(f.x>=0&&f.x<n&&f.y>=0&&f.y<m&&v[f.x][f.y][t.z]==0&&map[f.x][f.y]==‘P‘) { f.ans=t.ans+1; f.z=t.z; v[f.x][f.y][f.z]=1; q[e++]=f; } } for(int j=2;j<=t.z;j++) { for(int i=0;i<4;i++) { f.x=t.x+jx[i]*j; f.y=t.y+jy[i]*j; if(f.x>=0&&f.x<n&&f.y>=0&&f.y<m&&v[f.x][f.y][t.z-j]==0&&map[f.x][f.y]==‘P‘) { f.ans=t.ans+1; f.z=t.z-j; v[f.x][f.y][f.z]=1; q[e++]=f; } } } } printf("impossible\n"); return ; } int main() { while(scanf("%d%d%d",&n,&m,&d)!=EOF) { for(int i=0;i<n;i++) { scanf("%s",map[i]); } bfs(); } return 0; }
标签:des style blog http color os io for
原文地址:http://www.cnblogs.com/zhangmingcheng/p/3911103.html