炸弹人:
现有关卡:游戏者只有一枚炸弹,且炸弹可以杀死杀伤范围内所有敌人。请问炸弹放在哪个位置,可以消灭最多的敌人。
输入:
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;
}