标签:art help src sig ret 查找 figure lease ted
Description
Input
Output
Sample Input
8 9 1 1 1 3 2 1 1 3 3 1 1 3 4 1 1 3 1 1 0 3 1 2 0 3 1 3 0 3 1 4 0 3 2 1 1 2 2 1 2 3 1 3 1 1 3 2 1 3 3 1 1 2 0 3 3 0 4 3 1 1.5 1.5 4 0 1 1 0 1 1 1 1 1 2 1 1 1 1 2 0 1 1.5 1.7 -1 -1
Sample Output
5 -1
【题意】给出n,m分别表示墙数和门数
再给出n组x,y,op,t;op=1时表示起点为x,y的墙向上t个单位,op=0则表示起点为x,y的墙向右t个单位
再给出m组x,y,op;op=1时表示起点为x,y的门向上1个单位,op=0则表示起点为x,y的门向右1个单位
给出sx,sy;求从(1,1)到(sx,sy)最少经过的门
【思路】用xa记录(i,j)的格子的上面的边的状态,ya记录(i,j)的格子的右面的边的状态。进行bfs;
#include <iostream> #include<stdio.h> #include<string.h> #include<queue> using namespace std; const int inf=0x3f3f3f3f; const int N=210; int xa[N][N],ya[N][N];
//xa记录(i,j)的格子的上面的边的状态,ya记录(i,j)的格子的右面的边的状态
//用inf表示墙,0表示空,1表示门; int dis[N][N]; int di[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; int n,m; int wall=inf; int maxx,maxy; int get_val(int x,int y,int op)//检验一下有没有穿越门 { if(op==0) return ya[x][y];向右,检测当前格子的右边的值 else if(op==1) return ya[x-1][y];//向左,检测左边的格子的右边值 else if(op==2) return xa[x][y];//向上,检测当前格子的上边值 else return xa[x][y-1];//向下,检测下面格子的上边值 } bool go(int x,int y)//检测是否在范围内 { if(x<1||x>maxx||y<1||y>maxy) return false; else return true; } int bfs(int sx,int sy) { queue<int>qu; for(int i=0;i<=maxx;i++) { for(int j=0;j<=maxy;j++) { dis[i][j]=inf; } } dis[1][1]=0;//从(1,1)这个格子出发 qu.push(1);//横纵坐标都入队 qu.push(1); while(!qu.empty()) { int nowx=qu.front();qu.pop(); int nowy=qu.front();qu.pop(); for(int i=0;i<4;i++)//向四个方向查找 { int xx=nowx+di[i][0]; int yy=nowy+di[i][1]; int tmp=get_val(nowx,nowy,i); if(go(xx,yy)&&dis[xx][yy]>dis[nowx][nowy]+tmp)//在范围内,并经过的门少,则入队 { dis[xx][yy]=dis[nowx][nowy]+tmp; qu.push(xx); qu.push(yy); } } } return dis[sx][sy]==inf?-1:dis[sx][sy];//inf表示此路不通,无路可走 } int main() { while(~scanf("%d%d",&n,&m)) { if(m==-1&&n==-1) break; memset(xa,0,sizeof(xa)); memset(ya,0,sizeof(ya)); maxx=-1,maxy=-1; for(int i=1; i<=n; i++) { int x,y,op,t; scanf("%d%d%d%d",&x,&y,&op,&t); if(op) { for(int j=0; j<t; j++) ya[x][y+j+1]=wall; maxx=max(maxx,x+1); maxy=max(maxy,y+t+1); } else { for(int j=0;j<t;j++) { xa[x+j+1][y]=wall; } maxx=max(maxx,x+t+1); maxy=max(maxy,y+1); } } for(int i=1;i<=m;i++) { int x,y,op; scanf("%d%d%d",&x,&y,&op); if(op) { ya[x][y+1]=1; } else xa[x+1][y]=1; } double sx,sy; scanf("%lf%lf",&sx,&sy); if(sx<1||sx>199||sy<1||sy>199) printf("0\n"); else printf("%d\n",bfs((int)sx+1,(int)sy+1)); } return 0; }
标签:art help src sig ret 查找 figure lease ted
原文地址:http://www.cnblogs.com/iwantstrong/p/6035208.html