您的位置:首页 > 其它

炸弹人游戏_暴力枚举

2016-03-10 11:03 309 查看
先来说说题目意思吧,如图,帮助小人找到一个放炸弹的坐标,使之一颗炸弹炸死最多的敌人。



我们用字符G表示敌人,#表示墙, . 表示可以走的路,特别说明下,那种一推就倒的墙,就把它看做路吧。

BFS:

#include<iostream>
using namespace std;
struct note
{
int x;//横坐标
int y;//纵坐标
};
struct note que[401];
int book[20][20];
int i,j,k,sum,maxs=0,mx,my,n,m,startx,starty,tx,ty;
int next[4][2]={{0,1},
{1,0},
{0,-1},
{-1,0}};
char a[20][21];//用来存储地图
int getnum(int i,int j)
{
int sum,x,y;
sum=0;//记录可以消灭敌人的个数
//将坐标i,j复制到两个变量x,y中,保存初始坐标i,j;
x=i;
y=j;
while(a[x][y]!='#')
{
if(a[x][y]=='G')
sum++;
x--;//继续向下
}
x=i;
y=j;
while(a[x][y]!='#')
{
if(a[x][y]=='G')
sum++;
x++;//继续向下
}
x=i;
y=j;
while(a[x][y]!='#')
{
if(a[x][y]=='G')
sum++;
y--;//继续向左
}
x=i;
y=j;
while(a[x][y]!='#')
{
if(a[x][y]=='G')
sum++;
y++;//继续向右
}
return sum;
}
void bfs()
{
int head=1;
int tail=1;
que[tail].x=startx;
que[tail].y=starty;
tail++;
book[startx][starty]=1;
maxs=getnum(startx,starty);
mx=startx;
my=starty;
while(head<tail)
{
for(k=0;k<=3;k++)
{
tx=que[head].x+next[k][0];
ty=que[head].y+next[k][1];
if(tx<0||tx>n-1||ty<0||ty>m-1)
continue;
if(a[tx][ty]=='.'&&book[tx][ty]==0)
{
book[tx][ty]=1;
que[tail].x=tx;
que[tail].y=ty;
tail++;
sum=getnum(tx,ty);
if(sum>maxs)
{
maxs=sum;
mx=tx;
my=ty;
}
}
}
head++;
}
}
int main()
{
cin>>n>>m>>startx>>starty;
for(i=0;i<=n-1;i++)
cin>>a[i];
cout<<sum<<endl;
return 0;
}


DFS:

#include<cstdio>
#include<iostream>
using namespace std;
char a[20][21],book[20][20];
int mx,my,n,m,maxs;
int next[4][2]={{0,1},
{1,0},
{0,-1},
{-1,0}};
int getnum(int i,int j)
{
int sum,x,y;
sum=0;
x = i;y = j;  //记录初始的搜索点i,j
while ( a[x][y]!='#')
{
if ( a[x][y] == 'G' )
sum++;
x++;  //从初始搜索点向下 搜索
}
x = i;y = j;  //记录初始的搜索点i,j
while ( a[x][y]!='#' )
{
if ( a[x][y] == 'G' )
sum++;
x--;  //从初始搜索点向上搜索
}
x = i;y = j;  //记录初始的搜索点i,j
while ( a[x][y]!='#' )
{
if ( a[x][y] == 'G' )
sum++;
y--;  //从初始搜索点向左搜索
}
x = i;y = j;  //记录初始的搜索点i,j
while ( a[x][y]!='#' )
{
if ( a[x][y] == 'G' )
sum++;
y++;  //从初始搜索点向右搜索
}
return sum;

}
void  dfs(int x,int y)
{
int h,sum,tx,ty;
sum=getnum(x,y);
if(sum>maxs)
{
maxs=sum;
mx=x;
my=y;
}
for(h=0;h<=3;h++)
{
//计算下一个点坐标
tx=x+next[h][0];
ty=y+next[h][1];
//判断是否越界
if(tx<1||tx>n||ty<1||ty>n)
continue;
//判断是否是障碍物或者已经在路径中
if(a[tx][ty]=='.'&&book[tx][ty]==0)
{
//把这个点标记为已经走过
//注意宽带搜索每个点只能入队列一次 ,和dfs不同,所以book的值不需要恢复为0;
book[tx][ty]=1;
//插入新的点到队列中
dfs(tx,ty);
//因为放炸弹炸死的人数,不需要返回,我们只需要遍历每一个点,求得在每一个点炸死的人数。
//所以这里没有循环终止条件,return 直接不需要,book[tx][ty]=0; 也不需要恢复。
}
}
}
int main(void)
{
int i,startx,starty;
cin>>n>>m>>startx>>starty;
for ( int i = 0;i <n;i++ )
cin>>a[i];
book[startx][starty]=1;
maxs=getnum(startx,starty);
mx=startx;
my=starty;
dfs(startx,starty);
cout<<mx<<","<<my<<","<<n<<endl;
return 0;
}



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