题目大意:以连连看为原型的题目,给定地图和地图上两点,求从第一个点到第二个点最少需要转几次弯。。。 思路:还是走迷宫的变种,将转1.2.3......n次能到达的点都入队,求出最少的转弯次数 #include<iostream> using namespace std; struct mov { int x,y; }mov[4]={1,0,-1,0,0,1,0,-1}; char map[80][80]; int m,n,lock[4][80][80],head,rear; int queue[1000000],x1,y1,x2,y2; int pop(){ return queue[head++%1000000]; } void push(int i){ queue[rear++%1000000]=i; } int bfs() { int i,j,k,t,step,fang,dir; while(head!=rear) { i=pop(); j=pop(); dir=pop(); step=pop(); if(i==x2&&j==y2) return step; for(fang=0;fang<4;fang++) if(fang!=dir&&i+mov[fang].x>-1&&i+mov[fang].x<m+2&&j+mov[fang].y>-1&&j+mov[fang].y<n+2&&lock[fang][i+mov[fang].x][j+mov[fang].y]==0&&(map[i+mov[fang].x][j+mov[fang].y]==' '||(i+mov[fang].x==x2&&j+mov[fang].y==y2))) { for(t=2;;t++) if(!(i+t*mov[fang].x>-1&&i+t*mov[fang].x<m+2&&j+t*mov[fang].y>-1&&j+t*mov[fang].y<n+2&&lock[fang][i+t*mov[fang].x][j+t*mov[fang].y]==0&&(map[i+t*mov[fang].x][j+t*mov[fang].y]==' '||(i+t*mov[fang].x==x2&&j+t*mov[fang].y==y2)))) break; for(k=1;k<t;k++) { lock[fang][i+k*mov[fang].x][j+k*mov[fang].y]=1; push(i+k*mov[fang].x); push(j+k*mov[fang].y); push(fang); push(step+1); } } } return -1; } int main() { int i,j,o,b=1,s; while(cin>>n>>m&&n) { s=1; memset(map,' ',sizeof(map)); for(i=1;i<=m;i++) { cin.get(); for(j=1;j<=n;j++) if(cin.get()=='X') map[i][j]='X'; } cout<<"Board #"<<b++<<":"<<endl; while(cin>>y1>>x1>>y2>>x2&&x1) { head=rear=0; memset(lock,0,sizeof(lock)); for(i=0;i<4;i++) lock[i][x1][y1]=1; push(x1); push(y1); push(-1); push(0); o=bfs(); if(o>-1) cout<<"Pair "<<s++<<": "<<o<<" segments."<<endl; else cout<<"Pair "<<s++<<": impossible."<<endl; } cout<<endl; } return 0; }