对于80后来说,小霸王是抹不去的记忆,还记得当年有一个炸弹人游戏吗?
看看下面这一关应该放置在什么地方才能炸到最多的敌人,炸弹能炸到最远距离,碰到墙就停止。
以下程序就是求解上面问题的:
#include "stdio.h"
#include <windows.h>
using namespace std;
char iGameMap[13][13] = {
'#','#','#','#','#','#','#','#','#','#','#','#','#',
'#','G','G','.','G','G','G','#','G','G','G','.','#',
'#','#','#','.','#','G','#','G','#','G','#','G','#',
'#','.','.','.','.','.','.','.','#','.','.','G','#',
'#','G','#','.','#','#','#','.','#','G','#','G','#',
'#','G','G','.','G','G','G','.','#','.','G','G','#',
'#','G','#','.','#','G','#','.','#','.','#','#','#',
'#','#','G','.','.','.','G','.','.','.','.','.','#',
'#','G','#','.','#','G','#','#','#','.','#','G','#',
'#','.','.','.','G','#','G','G','G','.','G','G','#',
'#','G','#','.','#','G','#','G','#','.','#','G','#',
'#','G','G','.','G','G','G','#','G','.','G','G','#',
'#','#','#','#','#','#','#','#','#','#','#','#','#'
};
enum Direction
{
Left,
Right,
Up,
Down
};
struct Point
{
int x;
int y;
Point& operator= (const Point& p)
{
x = p.x;
y = p.y;
return *this;
}
};
int OneDirectionKill(Point p, Direction emDirect)
{
int iRes = 0;
while (iGameMap[p.x][p.y] != '#')
{
if ('G' == iGameMap[p.x][p.y])
{
iRes++;
}
switch (emDirect)
{
case Left:
p.x--;
break;
case Right:
p.x++;
break;
case Up:
p.y--;
break;
case Down:
p.y++;
break;
default:
break;
}
}
return iRes;
}
int KillEnemy(Point p)
{
int iSum = 0;
for (int i=Left; i<=Down; i++)
{
iSum += OneDirectionKill(p, (Direction)i);
}
return iSum;
}
int main()
{
HANDLE hstdout = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(hstdout, &csbi);
Point pMax;
int iMaxKill = 0;
for (int i=0; i<13; i++)
{
for (int j=0; j<13; j++)
{
if ('.' == iGameMap[i][j])
{
Point p;
p.x = i;
p.y = j;
SetConsoleTextAttribute(hstdout, 0x0C);
printf("%d ", KillEnemy(p));
SetConsoleTextAttribute(hstdout, 0x07);
if (iMaxKill < KillEnemy(p))
{
iMaxKill = KillEnemy(p);
pMax = p;
}
}
else
{
printf("%C ", iGameMap[i][j]);
}
}
printf("\r\n");
}
printf("MaxKill is %d, at the position (%d,%d)\r\n", iMaxKill, pMax.x, pMax.y);
return 0;
}
结果如下,为了能看的更加清楚,我另外显示了颜色,