好久没写博客,主要还是因为周末的考试和昨天生态学实验,忧伤的周末终于过去,更加的忧伤的日子已经来临orz
————写在前面的废话
这个题本来第一眼看是中文的,十分兴奋,结果……到底还是AC率20+%的题啊,理解错一个地方,有楼梯的地方不是只能顺着走,只是顺着走可以省时间1分钟,能不能最后也省时间不一定……挺简洁优雅的广搜
/****** hdu1180 2015.12.7 0MS 1432K 2625 B G++ ******/ #include"stdio.h" #include"string.h" #include"queue" using namespace std; int stair[22][22]; struct node { int x,y; int step; friend bool operator<(node n1,node n2) { return n2.step<n1.step; } }; int map[22][22]; int n,m; int dir[4][2]={1,0, 0,-1, -1,0, 0,1}; int x_s,y_s; int x_e,y_e; int judge(int x,int y) { if(x<0 || x>=n || y<0 || y>=m) return 1; if(map[x][y]==1) return 1; if(map[x][y]==2) return 2; return 0; } int judge2(int step,int x2,int y2,int k) { if((step+stair[x2][y2])%2!=0 && (k==0 || k==2)) return 1; if((step+stair[x2][y2])%2==0 && (k==1 || k==3)) return 1; return 0; } int BFS() { priority_queue<node>q; node cur,next; int temp; int t_x,t_y; cur.x=x_s; cur.y=y_s; cur.step=0; map[cur.x][cur.y]=1; q.push(cur); while(!q.empty()) { cur=q.top(); q.pop(); if(cur.x==x_e&&cur.y==y_e) return cur.step; for(int i=0;i<4;i++) { next.x=cur.x+dir[i][0]; next.y=cur.y+dir[i][1]; next.step=cur.step; temp=judge(next.x,next.y); if(temp==1) continue; if(!temp) { next.step++; map[next.x][next.y]=1; q.push(next); } else { t_x=next.x+dir[i][0]; t_y=next.y+dir[i][1]; if(judge(t_x,t_y)) continue;//就算有楼梯,跳过去是墙也不能走 if(judge2(next.step,next.x,next.y,i))//楼梯方向是顺着的 { next.x=t_x; next.y=t_y; next.step++; } else//楼梯的方向是逆着的 但是很幸运接着走可以 { next.x=t_x; next.y=t_y; next.step+=2; } q.push(next); } } } return -1; } int main() { //freopen("cin.txt","r",stdin); int i,l; int ans; char str[25]; while(scanf("%d%d",&n,&m)!=-1) { for(i=0;i<n;i++) { scanf("%s",str); for(l=0;str[l];l++) { if(str[l]=='S') {x_s=i;y_s=l;map[i][l]=0;} else if(str[l]=='T'){x_e=i;y_e=l;map[i][l]=0;} else if(str[l]=='|'){stair[i][l]=1;map[i][l]=2;} else if(str[l]=='-'){stair[i][l]=0;map[i][l]=2;} else if(str[l]=='*')map[i][l]=1; else if(str[l]=='.')map[i][l]=0; } } int ans=BFS(); printf("%d\n",ans); } return 0; }