搜索——炸弹人

炸弹人:

现有关卡:游戏者只有一枚炸弹,且炸弹可以杀死杀伤范围内所有敌人。请问炸弹放在哪个位置,可以消灭最多的敌人。

输入:

13 13 3 3
#############
#GG.GGG#GGG.#
###.#G#G#G#G#
#.......#..G#
#G#.###.#G#G#
#GG.GGG.#.GG#
#G#.#G#.#.#.#
##G...G.....#
#G#.#G###.#G#
#...G#GGG.GG#
#G#.#G#G#.#G#
#GG.GGG#G.GG#

#############

输出:

10   7   11


深搜

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define ms(a) memset(a,0,sizeof(a))
#define N

int book[15][15];//标记是否走过 
char a[15][15];//存放地图 
int maxs=0,mx,my;//用来放消灭敌人的最大数目 ,mx,my为放消灭敌人最大数的坐标 
int sum,n,m;//sum为计算每次消灭敌人的数目,n,m为地图n行 m列 
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//位置数组 
//得到在x,y这个地方消灭敌人的数目 
int getsum(int x,int y){
	int tx,ty,s=0;
	//向上消灭敌人的数目累加 
	tx=x,ty=y;
	while(a[tx][ty]=='.'||a[tx][ty]=='G'){
		if(a[tx][ty]=='G'){
			s++;
		}
		tx--;
	}
	//向右消灭敌人的数目累加 
	tx=x,ty=y;
	while(a[tx][ty]=='.'||a[tx][ty]=='G'){
		if(a[tx][ty]=='G'){
			s++;
		}
		ty++;
	}
	//向下消灭敌人的数目累加  
	tx=x,ty=y;
	while(a[tx][ty]=='.'||a[tx][ty]=='G'){
		if(a[tx][ty]=='G'){
			s++;
		}
		tx++;
	}
	//向左消灭敌人的数目累加  
	tx=x,ty=y;
	while(a[tx][ty]=='.'||a[tx][ty]=='G'){
		if(a[tx][ty]=='G'){
			s++;
		}
		ty--;
	}
	return s;
}

void dfs(int x,int y){
	int tx,ty;
	sum=getsum(x,y);
	//更新最大数 
	if(sum>maxs){
		maxs=sum;
		mx=x;
		my=y;
	}
	//进入方向循环 
	for(int i=0;i<4;i++){
		tx=x+next[i][0];
		ty=y+next[i][1];
		//出界判断 
		if(tx<0||ty<0||tx>n||ty>m){
			continue;
		}
		//看走的地方是否符合 
		if(book[tx][ty]==0&&a[tx][ty]=='.'){
			book[tx][ty]=1;
			dfs(tx,ty);
		}
	}
	return;
}
int main(){
	int sx,sy;
	cin>>n>>m>>sx>>sy;
	for(int i=0;i<13;i++){
		for(int j=0;j<13;j++){
			cin>>a[i][j];
		}
	}
	//初始化 
	sum=0;
	book[sx][sy]=1;
	maxs=getsum(sx,sy);
	mx=sx;
	my=sy;
	dfs(sx,sy);
	//输出最后结果 
	cout<<maxs<<"   "<<mx<<"   "<<my<<endl;
	return 0;
}

广搜

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define ms(a) memset(a,0,sizeof(a))
#define N
struct node{
	int x;
	int y;
};
struct node queue[225];
int book[15][15]={0};
char a[15][15];
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int getnum(int x,int y){
	int tx,ty,s=0;
	//向上消灭敌人的数目累加 
	tx=x,ty=y;
	while(a[tx][ty]=='.'||a[tx][ty]=='G'){
		if(a[tx][ty]=='G'){
			s++;
		}
		tx--;
	}
	//向右消灭敌人的数目累加 
	tx=x,ty=y;
	while(a[tx][ty]=='.'||a[tx][ty]=='G'){
		if(a[tx][ty]=='G'){
			s++;
		}
		ty++;
	}
	//向下消灭敌人的数目累加  
	tx=x,ty=y;
	while(a[tx][ty]=='.'||a[tx][ty]=='G'){
		if(a[tx][ty]=='G'){
			s++;
		}
		tx++;
	}
	//向左消灭敌人的数目累加  
	tx=x,ty=y;
	while(a[tx][ty]=='.'||a[tx][ty]=='G'){
		if(a[tx][ty]=='G'){
			s++;
		}
		ty--;
	}
	return s;
}

int main(){
	int n,m,sx,sy,maxs,mx,my,tx,ty,head,tail,sum;
	cin>>n>>m>>sx>>sy;
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			cin>>a[i][j];
		}
	}
	maxs=getnum(sx,sy);
	mx=sx;
	my=sy;
	head=tail=1;
	book[sx][sy]=1;
	queue[tail].x=sx;
	queue[tail].y=sy;
	tail++;
	while(head<tail){
		for(int i=0;i<4;i++){
			tx=queue[head].x+next[i][0];
			ty=queue[head].y+next[i][1];
			if(tx<0||ty<0||tx>n-1||ty>m-1){
				continue;
			}
			if(book[tx][ty]==0&&a[tx][ty]=='.'){
				book[tx][ty]=1;
				queue[tail].x=tx;
				queue[tail].y=ty;
				tail++;
				sum=getnum(tx,ty);
				if(sum>maxs){
					maxs=sum;
					mx=tx;
					my=ty;
				}
			}
		}
		head++;
	}
	cout<<maxs<<"  "<<mx<<"  "<<my<<endl;
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值