您的位置:首页 > 其它

NYOJ 284 坦克大战【优先队列】

2012-03-10 16:19 323 查看
代码:
#include<stdio.h>
#include<queue>
#include<string.h>
int map[305][305],n,m;
int zy[]={0,0,1,-1},sx[]={1,-1,0,0};
using namespace std;
struct node
{
    friend bool operator< (node n1, node n2) //优先级。。
    {
        return n1.step> n2.step;
    }
 
    int x;
    int y;
	int step; 
};
void bfs(int x1,int y1)
{
	int a,b,i,j,loop=0;
	int min=1;
	node k={x1,y1,min};
    priority_queue<node> q;
	q.push(k);
	while(!q.empty())
	{
		i=q.top().x;
		j=q.top().y;
		min=q.top().step;                               
		q.pop();
		for(a=0;a<4;a++)
		{
			x1=i+zy[a];
			y1=j+sx[a];
			if(map[x1][y1]==1||map[x1][y1]==2)
			{
				node p1={x1,y1,min+map[x1][y1]};
				q.push(p1);
				map[x1][y1]=0;
			}
			if(map[x1][y1]==4)
			{
			   loop=1;
			   break;
			}
			
		}
		if(loop==1)
		{
			break;
		}
	}
	if(loop==1)
		printf("%d\n",min);
	else
		printf("-1\n");
}
int main()
{
	int a,b;
	char ch;
	while(1)
	{
	   scanf("%d %d",&n,&m);
	   if(n==0&&m==0)
		   break;
	   memset(map,0,sizeof(map));//这个不用解释了吧。。在外面加一层0。。
	   for(a=1;a<=n;a++)
	   {
		   getchar();//注意。。少了你就悲剧了。。
		   for(b=1;b<=m;b++)
		   {
			    scanf("%c",&ch);
		    	if(ch=='Y')  //you
				    map[a][b]=3;
			    else if(ch=='T')
				    map[a][b]=4;//目标
			    else if(ch=='S'&&ch=='R')
				    map[a][b]=0; //不能走
			    else if(ch=='E')
				    map[a][b]=1;
			    else if(ch=='B') //注意呀。。这句话换成else结果就错了。。不信你试试。。
				    map[a][b]=2;
		   }
	   }
	   for(a=1;a<=n;a++)
		  for(b=1;b<=m;b++)
			  if(map[a][b]==3)
			    	bfs(a,b);
	}
	
}


原题链接:点击打开

有点郁闷呀!!早就该ac的题 找了一天的错。。。⊙﹏⊙。。找到错误后 还不知道原因。。先交了再说吧。。英文题 看懂题以后其实挺简单的。。广度优先搜索+优先队列就能ac了。。就是一些细节要注意一下。。要不然就一直wr了。。。

代码在上面::
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: