ACM-Giroro的地雷测试(AC,广度优先搜索)

Giroro的地雷测试

Time Limit:1000MS  Memory Limit:65536K
Total Submit:1 Accepted:0

Description

为了早日完成侵略蓝星的使命,Giroro最近新入手了一批地雷。为了测试地雷的可爆性(旁白:有这性质的?),Giroro在一些地方埋下了地雷,并让Tamama射出Tamama冲击波来引爆这些地雷。因为Tamama冲击波的威力是很大的,所以在距离Tamama冲击波距离不大于d的地雷都会爆炸。当一个地雷爆炸时,在这个地雷的爆炸范围内的地雷也会被引爆,而且地雷的爆炸半径各不相同。Giroro迫切想知道被引爆的地雷有多少个!一支大炮直接指向了Tamama…可怜的Tama仔只好找你解决这个问题了。
XxX_Stu帮忙把问题抽象成了计算机问题,描述如下:给点n个地雷的坐标,都为整数坐标,以及它们的爆炸半径。然后给定Tamama发射的纵坐标,以及d也是整数,默认Tamama站在世界的最左端面向世界的最右端水平向右发射冲击波,而且你可以认为Tamama冲击波是无限长的。
图示如下:
84721582

Input

数据有多组。读入直到文件结束。
对于每组数据:第1行,3个整数n,y,d。表示n个地雷,Tamama冲击波的纵坐标y,冲击波的波及范围d。接下来n行,每行3个整数xi,yi,ri。表示每个地雷的坐标和爆炸半径。0<=n<=200 ; 0<=y , d ,xi , yi , ri <=1000 .

Output

对于每组数据,输出一个整数。即地雷爆炸的个数。

Sample Input

1 1 2
1 2 2
2 1 1
1 1 5
1 3 1

Sample Output

1
2

Source

 

/*	----------------------------------------------------------------------
	大概思路:因为这一道题的情况是这样的,假设有ABCDEF个地雷,A可能引爆C,C
	又可能引爆E,E又有可能回头引爆B,B再引爆F这样子。。所以一般的遍历可能会出错
	,又或者可能会超时。所以这里用广度优先搜索。。自己构造了一个队列。。不是循环
	队列的说,怕出错。。

	状况:15MS
	----------------------------------------------------------------------	*/



#include<stdio.h>
#include<math.h>
#include<memory.h>

int a[202][4] ;
int BombQueue[205] ;

int main(void)
{
	int i = 0 ;
	int j = 0 ;
	int n = 0 ;
	int y = 0 ;
	int d = 0 ;
	int k = 0 ;
	int nVecLen = 0 ;
	int nIBob = 0 ;
	int nJBob = 0 ;
	int nTotal = 0 ;
	int nHead = 0 ;
	int nLen = 0 ;
	int nNowBomb = 0 ;

	while(scanf("%d%d%d",&n,&y,&d) != EOF)
	{	
		nTotal = 0 ;
		memset(a,0,sizeof(a)) ;
		memset(BombQueue,0,sizeof(BombQueue)) ;
		nHead = 0 ;
		nLen = 0 ;

		for(i = 0 ; i < n ; ++i)
		{
			scanf("%d%d%d",&a[i][0],&a[i][1],&a[i][2]) ;
		}

		for(i = 0 ; i < n ; ++i)
		{
			if(d >= abs(a[i][1]-y))
			{
				a[i][3] = 1 ;				
				nTotal++ ;
					
				BombQueue[nLen] = i ;
				nLen++ ;
			}
		}
		while(nLen != 0)
		{

			nNowBomb = BombQueue[0] ;
			nLen-- ;

			for(k = 0 ; k < nLen ; ++k)
			{
				BombQueue[k] = BombQueue[k+1] ;
			}
			nLen = k ;
			for(i = 0 ; i < n ; ++i)
			{
				if(i == nNowBomb)
				{
					continue ;
				}
				nVecLen = (a[i][0]-a[nNowBomb][0])*(a[i][0]-a[nNowBomb][0]) + (a[i][1]-a[nNowBomb][1])*(a[i][1]-a[nNowBomb][1]) ;
				nIBob = a[nNowBomb][2]*a[nNowBomb][2] ; 
			
				if(0 == a[i][3] && nVecLen <= nIBob)
				{
					nTotal++ ;
					a[i][3] = 1 ;
					BombQueue[nLen] = i ;
					nLen++ ;	
				}
			}
		}
		printf("%d\n",nTotal) ;
	}
	return 0 ;
}


 

 

错解
#include<stdio.h>
#include<math.h>

int a[202][4] ;

int main(void)
{
	int i = 0 ;
	int j = 0 ;
	int n = 0 ;
	int y = 0 ;
	int d = 0 ;
	int nVecLen = 0 ;
	int nIBob = 0 ;
	int nJBob = 0 ;
	int nTotal = 0 ;

	while(scanf("%d%d%d",&n,&y,&d) != EOF)
	{	
		nTotal = 0 ;
		for(i = 0 ; i < n ; ++i)
		{
			scanf("%d%d%d",&a[i][0],&a[i][1],&a[i][2]) ;
		}

		for(i = 0 ; i < n ; ++i)
		{
			if(d >= abs(a[i][1]-y))
			{
				a[i][3] = 1 ;				//表示已经被激光射中,会爆
				nTotal++ ;
			}
		}

		for(i = 0 ; i < n ; ++i)
		{
			for(j = 0 ; j < n ; ++j)
			{
				if(i == j)
				{
					continue ;
				}
				nVecLen = (a[i][0]-a[j][0])*(a[i][0]-a[j][0]) + (a[i][1]-a[j][1])*(a[i][1]-a[j][1]) ;
				nIBob = a[i][2]*a[i][2] ; 
				nJBob = a[j][2]*a[j][2] ;
				if(1 == a[i][3] && 0 == a[j][3] && nVecLen <= nIBob)
				{
					nTotal++ ;
					a[j][3] = 1 ;
				}
				else if(0 == a[i][3] && 1 == a[j][3] && nVecLen <= nJBob)
				{
					nTotal++ ;
					a[i][3] = 1 ;
				}
			}
		}
		printf("%d\n",nTotal) ;
	}
	return 0 ;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值