您的位置:首页 > 其它

hihoCoder搜索二---骑士问题---暴力法

2016-06-17 22:10 357 查看
题目链接:http://hihocoder.com/problemset/problem/1308

直接按照提示给出的方法做,用BFS记录每个骑士到每个点的最小距离,在求所有的最小距离的和最小的点处,得到的即为最小和。

小Ho:小Hi你刚刚说到了这样一点:放置在任何一个初始位置的骑士,都可以通过若干次移动到达棋盘上任意一个位置。

那么我就可以把整个局面分开来做:我先计算出每一个骑士到达棋盘上每个位置的最短距离;再枚举每一个位置,表示将三个骑士在这个位置上汇合,累加这三个骑士到达的步数之和;最后选择一个最小的和作为解。

求解骑士到达每一个位置最少步数时,我可以使用之前讲过的宽度优先搜索。从而保证我第一次枚举到这个位置时就是最少的步数。


注意坑点:

1.使用到三维数组记录最小值,其第一维长度为3,表示三个骑士;第二和三维表示棋盘。

在传参时注意写上第三和第二维的长度。

2.在BFS时我少加了到前一步的步数,改了许久。/(ㄒoㄒ)/~~

具体代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
//int ans = 10000000;
int dicx[8] = { 1,-1,2,-2,-2,-1,1,2 };
int dicy[8] = { 2,2,1,1,-1,-2,-2,-1 };
typedef struct Node
{
int x;
int y;
}Node;
queue<Node> q;
int step[3][10][10];
int inx[3];
int iny[3];

void BFS(int f[10][10] ,int in_x, int in_y)
{
for (int i = 0; i<10; i++)
{
for (int j = 0; j<10; j++)
{
f[i][j] = -1;
}
}
f[in_x][in_y] = 0;
Node n, N;
n.x = in_x;
n.y = in_y;
while (!q.empty())
{
q.pop();
}
q.push(n);
while (!q.empty())
{
N = q.front();
q.pop();
for (int i = 0; i<8; i++)
{
int X = N.x + dicx[i];
int Y = N.y + dicy[i];
if (X <= 8 && X >= 1 && Y <= 8 && Y >= 1 && f[X][Y] == -1)
{
Node t;
t.x = X;
t.y = Y;
f[t.x][t.y]=f[N.x][N.y]+1;
q.push(t);
}
}
}
}

int main()
{
int T;
scanf("%d", &T);
while (T--)
{
int ans = 10000000;
memset(step,0,sizeof(step));
for (int i = 0; i < 3; i++)
{
char c[3];
scanf("%s", c);
inx[i] = c[0] - 'A' + 1;
iny[i] = c[1] - '0';
}
//      for(int i=0;i<3;i++)
//      {
//          cout<<inx[i]<<iny[i]<<endl;
//      }
for (int i = 0; i < 3; i++)
BFS(step[i], inx[i], iny[i]);

for (int i = 1; i <= 8; i++)
{
for (int j = 1; j <= 8; j++)
{
//cout<<step[0][i][j]<<" "<<step[1][i][j]<<" "<<step[2][i][j]<<endl;
if (ans > (step[0][i][j]+ step[1][i][j] + step[2][i][j]))
{
//cout<<step[0][i][j]<<" "<<step[1][i][j]<<" "<<step[2][i][j]<<endl;
ans = step[0][i][j] + step[1][i][j] + step[2][i][j];
}
}
}
cout << ans << endl;
}
return 0;
}


仅代表个人观点,欢迎交流探讨,勿喷~~

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