hihoCoder搜索二---骑士问题---暴力法
2016-06-17 22:10
357 查看
题目链接:http://hihocoder.com/problemset/problem/1308
直接按照提示给出的方法做,用BFS记录每个骑士到每个点的最小距离,在求所有的最小距离的和最小的点处,得到的即为最小和。
注意坑点:
1.使用到三维数组记录最小值,其第一维长度为3,表示三个骑士;第二和三维表示棋盘。
在传参时注意写上第三和第二维的长度。
2.在BFS时我少加了到前一步的步数,改了许久。/(ㄒoㄒ)/~~
具体代码如下:
仅代表个人观点,欢迎交流探讨,勿喷~~
直接按照提示给出的方法做,用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; }
仅代表个人观点,欢迎交流探讨,勿喷~~
相关文章推荐
- 【caffe-Windows】微软官方caffe之 matlab接口配置
- 高性能平台运行java程序内容溢出
- linux系统启动流程
- Android 自定义ViewGroup最佳入门实践
- SE要有政治能力
- JAVA IO总结
- && || 判断规则
- Java中读取properties资源文件
- 1-web应用之LAMP源码环境搭建
- CentOS下安装Git和初始化一个Git仓库。
- Solr/SolrCloud 莫名出现了CompoundFile
- Java多线程编程
- 使用Qpython3制作老版天翼飞TP路由器拨号脚本
- PHP学习心得2
- selenium(java)浏览器多窗口切换处理
- iOS开发多线程篇—多线程简单介绍
- 打印1到最大的n位数
- Python+MongoDB自增键值的实现
- thinkphp3.2【开发、生产模式】
- iOS文字样式处理总结(字体、前背景色、斜体、加粗、对齐、行间距、段间距、动态获取字符串label宽高等)