搜索专题: HDU1372Knight Moves
Knight Moves
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11832 Accepted Submission(s): 6969
the most difficult part of the problem is determining the smallest number of knight moves between two given squares and that, once you have accomplished this, finding the tour would be easy.
Of course you know that it is vice versa. So you offer him to write a program that solves the "difficult" part.
Your job is to write a program that takes two squares a and b as input and then determines the number of knight moves on a shortest route from a to b.
the row on the chessboard.
e2 e4
a1 b2
b2 c3
a1 h8
a1 h7
h8 a1
b1 c3
f6 f6
To get from e2 to e4 takes 2 knight moves.
To get from a1 to b2 takes 4 knight moves.
To get from b2 to c3 takes 2 knight moves.
To get from a1 to h8 takes 6 knight moves.
To get from a1 to h7 takes 5 knight moves.
To get from h8 to a1 takes 6 knight moves.
To get from b1 to c3 takes 1 knight moves.
To get from f6 to f6 takes 0 knight moves.
RunId : 21142000 Language : G++ Author : hnustwanghe
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int N = 8+5;
int visit[N][N];
typedef struct node{
int x,y,step;
}Node;
const int dir[8][2]={{2,1},{-2,1},{-2,-1},{2,-1},{1,2},{1,-2},{-1,-2},{-1,2}};
int print(){
for(int i=1;i<=8;i++)
for(int j=1;j<=8;j++){
printf("%d",visit[i][j]);
if(j==7)
printf("\n");
}
}
int DBFS(int x,int y,int goalx,int goaly){
queue<Node> Q1,Q2;
Node t,s;
int step1=0,step2=0,flag =1,cnt,newx,newy,ans;
memset(visit,0,sizeof(visit));
t.x = x,t.y = y,t.step = 0;
s.x = goalx,s.y = goaly,s.step = 0;
visit[t.x][t.y] = 1;
visit[s.x][s.y] = 2;
Q1.push(t);
Q2.push(s);
while(flag){
cnt = Q1.size();
while(cnt--){
t = Q1.front();
if(t.x == goalx && t.y == goaly) return t.step;
for(int d=0;d<8;d++){
newx = t.x + dir[d][0];
newy = t.y + dir[d][1];
step1 = t.step + 1;
if(newx>0 && newx <= 8 && newy>0 && newy<=8){
if(visit[newx][newy]==2){
ans = step1 + step2;
return ans;
}
if(!visit[newx][newy]){
s.x = newx,s.y= newy,s.step = step1;
Q1.push(s);
visit[newx][newy] = 1;
}
}
}
Q1.pop();
}
cnt = Q2.size();
while(cnt--){
t = Q2.front();
if(t.x==x && t.y==y) return t.step;
for(int d=0;d<8;d++){
newx = t.x + dir[d][0];
newy = t.y + dir[d][1];
step2 = t.step + 1;
if(newx>0 && newx<=8 && newy>0 && newy <=8){
if(visit[newx][newy]==1){
ans = step1 + step2;
return ans;
}
if(!visit[newx][newy]){
s.x = newx,s.y = newy,s.step = step2;
Q2.push(s);
visit[newx][newy] = 2;
}
}
}
Q2.pop();
}
}
return -1;
}
void Input_and_solve(){
char ch[10];
int x,y,goalx,goaly;
while(gets(ch)!=NULL){
x = ch[0]-'a'+1;
y = ch[1]-'0';
goalx = ch[3]-'a'+1;
goaly = ch[4]-'0';
printf("To get from %c%c to %c%c takes %d knight moves.\n",ch[0],ch[1],ch[3],ch[4],DBFS(x,y,goalx,goaly));
//print();
}
}
int main(){
Input_and_solve();
}
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std; const int N = 8+5;
int visit[N][N];
typedef struct node{
int x,y,step;
}Node;
const int dir[8][2]={{2,1},{-2,1},{-2,-1},{2,-1},{1,2},{1,-2},{-1,-2},{-1,2}};
int print(){
for(int i=1;i<=8;i++)
for(int j=1;j<=8;j++){
printf("%d",visit[i][j]);
if(j==7)
printf("\n");
}
}
int DBFS(int x,int y,int goalx,int goaly){
queue<Node> Q1,Q2;
Node t,s;
int step1=0,step2=0,flag =1,cnt,newx,newy,ans;
memset(visit,0,sizeof(visit));
t.x = x,t.y = y,t.step = 0;
s.x = goalx,s.y = goaly,s.step = 0;
visit[t.x][t.y] = 1;
visit[s.x][s.y] = 2;
Q1.push(t);
Q2.push(s);
while(flag){
cnt = Q1.size();
while(cnt--){
t = Q1.front();
if(t.x == goalx && t.y == goaly) return t.step;
for(int d=0;d<8;d++){
newx = t.x + dir[d][0];
newy = t.y + dir[d][1];
step1 = t.step + 1;
if(newx>0 && newx <= 8 && newy>0 && newy<=8){
if(visit[newx][newy]==2){
ans = step1 + step2;
return ans;
}
if(!visit[newx][newy]){
s.x = newx,s.y= newy,s.step = step1;
Q1.push(s);
visit[newx][newy] = 1;
}
} }
Q1.pop();
}
cnt = Q2.size();
while(cnt--){
t = Q2.front();
if(t.x==x && t.y==y) return t.step;
for(int d=0;d<8;d++){
newx = t.x + dir[d][0];
newy = t.y + dir[d][1];
step2 = t.step + 1;
if(newx>0 && newx<=8 && newy>0 && newy <=8){
if(visit[newx][newy]==1){
ans = step1 + step2;
return ans;
}
if(!visit[newx][newy]){
s.x = newx,s.y = newy,s.step = step2;
Q2.push(s);
visit[newx][newy] = 2;
}
}
}
Q2.pop();
}
} return -1;
}
void Input_and_solve(){
char ch[10];
int x,y,goalx,goaly;
while(gets(ch)!=NULL){
x = ch[0]-'a'+1;
y = ch[1]-'0';
goalx = ch[3]-'a'+1;
goaly = ch[4]-'0';
printf("To get from %c%c to %c%c takes %d knight moves.\n",ch[0],ch[1],ch[3],ch[4],DBFS(x,y,goalx,goaly));
//print();
}
}
int main(){
Input_and_solve();
}
Problem : 1372 ( Knight Moves ) Judge Status : Accepted#include<iostream>
RunId : 21135178 Language : G++ Author : hnustwanghe
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std; typedef struct node{
int x,y,step;
}Node;
bool visit[10][10];
const int dir[8][2]={{-2,1},{-2,-1},{2,-1},{2,1},{1,2},{1,-2},{-1,2},{-1,-2}};
int BFS(int x,int y,int goalx,int goaly){
queue<Node>Q;
memset(visit,0,sizeof(visit));
int newx,newy;
Node t,s;
t.x = x,t.y = y,t.step = 0;
visit[t.x][t.y] = true;
Q.push(t); while(!Q.empty()){
t = Q.front();
if(t.x==goalx && t.y==goaly) return t.step;
for(int d=0;d<8;d++){
newx = t.x+dir[d][0];
newy = t.y+dir[d][1];
if(newx>=1 && newx<=8 && newy>=1 && newy<=8 && !visit[newx][newy]){
s.x = newx;
s.y = newy;
s.step = t.step+1;
Q.push(s);
}
}
Q.pop();
}
return -1;
}
void Input_data_and_solve(){
char a,c,ch[10];
int b,d,x,y,goalx,goaly;
while(gets(ch)!=NULL){
a = ch[0];
b = ch[1]-'0';
c = ch[3];
d = ch[4]-'0';
x = a-'a'+1;
y = b;
goalx = c-'a'+1;
goaly = d;
BFS(x,y,goalx,goaly);
printf("To get from %c%d to %c%d takes %d knight moves.\n",a,b,c,d,BFS(x,y,goalx,goaly));
}
}
int main(){
Input_data_and_solve();
}#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std; typedef struct node{
int x,y,step;
}Node;
bool visit[10][10];
const int dir[8][2]={{-2,1},{-2,-1},{2,-1},{2,1},{1,2},{1,-2},{-1,2},{-1,-2}};
int BFS(int x,int y,int goalx,int goaly){
queue<Node>Q;
memset(visit,0,sizeof(visit));
int newx,newy;
Node t,s;
t.x = x,t.y = y,t.step = 0;
visit[t.x][t.y] = true;
Q.push(t); while(!Q.empty()){
t = Q.front();
if(t.x==goalx && t.y==goaly) return t.step;
for(int d=0;d<8;d++){
newx = t.x+dir[d][0];
newy = t.y+dir[d][1];
if(newx>=1 && newx<=8 && newy>=1 && newy<=8 && !visit[newx][newy]){
s.x = newx;
s.y = newy;
s.step = t.step+1;
Q.push(s);
}
}
Q.pop();
}
return -1;
}
void Input_data_and_solve(){
char a,c,ch[10];
int b,d,x,y,goalx,goaly;
while(gets(ch)!=NULL){
a = ch[0];
b = ch[1]-'0';
c = ch[3];
d = ch[4]-'0';
x = a-'a'+1;
y = b;
goalx = c-'a'+1;
goaly = d;
BFS(x,y,goalx,goaly);
printf("To get from %c%d to %c%d takes %d knight moves.\n",a,b,c,d,BFS(x,y,goalx,goaly));
}
}
int main(){
Input_data_and_solve();
}
搜索专题: HDU1372Knight Moves的更多相关文章
- HDU(搜索专题) 1000 N皇后问题(深度优先搜索DFS)解题报告
前几天一直在忙一些事情,所以一直没来得及开始这个搜索专题的训练,今天做了下这个专题的第一题,皇后问题在我没有开始接受Axie的算法低强度训练前,就早有耳闻了,但一直不知道是什么类型的题目,今天一看,原 ...
- NOIP2018提高组金牌训练营——搜索专题
NOIP2018提高组金牌训练营——搜索专题 1416 两点 福克斯在玩一款手机解迷游戏,这个游戏叫做”两点”.基础级别的时候是在一个n×m单元上玩的.像这样: 每一个单元有包含一个有色点.我们将用不 ...
- 搜索专题:Balloons
搜索专题:Balloons 这道题一看与时间有关,第一想到的就是BFS,定义一个状态,包含每一个状态的剩余气球数,已经进行的时间和每一个志愿者上一次吹气球的时间: 每一次状态转换时,检查是否有没有使用 ...
- 2015 UESTC 搜索专题F题 Eight Puzzle 爆搜
Eight Puzzle Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/61 ...
- 2014 UESTC暑前集训搜索专题解题报告
A.解救小Q BFS.每次到达一个状态时看是否是在传送阵的一点上,是则传送到另一点即可. 代码: #include <iostream> #include <cstdio> # ...
- 【PHP高效搜索专题(2)】sphinx&coreseek在PHP程序中的应用实例
PHP可以通过三种途径来调用sphinx 通过Sphinx官方提供的API接口(接口有Python,Java,Php三种版本) 通过安装SphinxSE,然后创建一个中介sphinxSE类型的表,再通 ...
- 【PHP高效搜索专题(1)】sphinx&Coreseek的介绍与安装
我们已经知道mysql中带有"%keyword%"条件的sql是不走索引的,而不走索引的sql在大数据量+大并发量的时候,不仅效率极慢还很有可能让数据库崩溃.那我们如何通过某些关键 ...
- 2015 UESTC 搜索专题B题 邱老师降临小行星 记忆化搜索
邱老师降临小行星 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/61 Des ...
- 蓝桥杯dfs搜索专题
2018激光样式 #include<bits/stdc++.h> using namespace std; /* dfs(i) 第i个激光机器 有两种选择:vis[i-1] == 0 时 ...
随机推荐
- ASP教程:gb2312和utf-8乱码问题解决
文章为转载:https://www.xp.cn/b.php/31663.html 尊重作者版权 今天做网站的时候,客户要一个博客,于是就利用了本博客所用的程序pjblog.经常做网站的人都知道,在同一 ...
- React Native中集成友盟社会化分享-----童叟无欺
1.下载所需的jar,下载地址https://developer.umeng.com/sdk/reactnative?spm=a211g2.211692.0.0.28967d238GW6mC 2.将以 ...
- Android学习笔记之数据的Sdcard存储方法及操作sdcard的工具类
FileService.java也就是操作sdcard的工具类: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ...
- [CSP-S模拟测试]:stone(结论+桶+前缀和+差分)
题目描述 $Cab$有两行石子,每个石子上有一个字母,为$'C''A''B'$中的一个.一开始,在每行第一个石子上站着一只$lucky$,$Cab$每次可以选择一个字母,使得所站石子上字母为该字母的$ ...
- vue 在移动端实现红包雨 (兼容性好)
下面是代码:<template> <div class="ser_home"> <ul class="red_packe ...
- vscode中让html中php代码高亮
找到设置中的文件设置中的files.associations,增加以下内容(注意一下内容要放在右侧的用户设置中,而不是放在中间的默认设置中): { // Configure file associat ...
- (转)js中then方法说明
javascript中的then方法说明: then()方法是异步执行. 意思是:就是当.then()前的方法执行完后再执行then()内部的程序,这样就避免了,数据没获取到等的问题. 语法:pr ...
- @RequestMapping 和@ResponseBody 和 @RequestBody和@PathVariable 注解 注解用法
接下来讲解一下 @RequestMapping 和@ResponseBody 和 @RequestBody和@PathVariable 注解 注解用法 @RequestMapping 为url映射路 ...
- Xcode升级10.3后XIB文件报错
Xcode升级10.3后XiB文件包错,提示: Failed to find or create execution context for description '<IBCocoaTouch ...
- 浅谈移动端设备标识码:DeviceID、IMEI、IDFA、UDID和UUID -费元星
在公司做数据分析的时候,发现NA端有很多ID,所有来系统的理解一下,有问题大家多指出 [心路历程] 最近刚好在思考工作中统计数据所用的标识码产生的数据误差到底有多大,借此机会几番搜索资料+请教大神 ...