written by: 东篱下の悠然
游戏玩法说明:输入地图(矩阵)的行和列, 输入角色的起点,分别用空格隔开,回车。输入地图:(地图第一行编号为0,第二行编号为1,列也一样)要求地图上下左右用井号“#”包围代表墙壁,通道为英文句点“.” ,敌人用“G”表示。程序将会返回一个坐标和一个数字,分别代表炸弹放置的位置和可消灭的最大敌人数(炸弹不可以穿透墙壁)
程序为c++:
#include <bits/stdc++.h>
//坐标
struct node {
int x;
int y;
};
//存储地图
char a[20][25];
//统计最多能干掉的敌人数
int getnum(int i, int j){
int sum, x, y;
sum = 0;//最大消灭敌人数
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;
}
/*
* breadth first search
*/
int main(){
printf("Q版泡泡堂第一关\n\n");
struct node queue[20 * 20 + 1];//地图不超过20 * 20
int book[20][20] = {0};
int j, k, sum, max = 0, mx, my, tx, ty;
//准备行走方向
int next [4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
//输入地图
int m, n, startx, starty;
scanf("%d%d%d%d",&n, &m, &startx, &starty);
for(int i = 0; i < n; i++)
scanf("%s", a[i]);
//角色起点入队
int head = 1, tail = 1;
queue[tail].x = startx; queue[tail].y = starty;
tail ++;
book[startx][starty] = 1;//marked
max = getnum(startx, starty);
mx = startx; my = starty;
while(head < tail){ //list不空:
//每次行走一步
for(int k = 0; k <= 3; k++){
int tx = queue[head].x + next[k][0];//尝试行走
int ty = queue[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;
queue[tail].x = tx;
queue[tail].y = ty;
tail ++;
sum = getnum(tx, ty);//统计新坐标可消灭的敌人数
if(sum > max){ //更新max
max = sum;
mx = tx;
my = ty;
}
}
}
head ++; //更新队首
}
printf("(%d, %d) %d", mx, my, max);
getchar(); getchar();
return 0;
}
附一个地图:运行程序,可用该地图测试。
/*
#############
#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#
#############
*/