搜索专题: 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 时 ...
随机推荐
- GO语言学习笔记2-int类型的取值范围
相比于C/C++语言的int类型,GO语言提供了多种int类型可供选择,有int8.int16.int32.int64.int.uint8.uint16.uint32.uint64.uint. 1.i ...
- jQery Datatables回调函数中文
Datatables——回调函数 ------------------------------------------------- fnCookieCallback:还没有使用过 $(documen ...
- BZOJ 2121: 字符串游戏 区间DP + 思维
Description BX正在进行一个字符串游戏,他手上有一个字符串L,以及其他一些字符串的集合S,然后他可以进行以下操作:对 于一个在集合S中的字符串p,如果p在L中出现,BX就可以选择是否将其删 ...
- BeanPostProcessor和BeanFactoryPostProcessor的区别
官方文档: 在Spring核心的1.8章节 使用BeanPostProcessor自定义Bean BeanPostProcessor 接口定义了您可以实现的回调方法,以提供您自己的(或覆盖容器的默认) ...
- AtCoder AGC001F Wide Swap (线段树、拓扑排序)
题目链接: https://atcoder.jp/contests/agc001/tasks/agc001_f 题解: 先变成排列的逆,要求\(1\)的位置最小,其次\(2\)的位置最小,依次排下去( ...
- 在Java web模板的上进行编写
要求: 链接:https://pan.baidu.com/s/15NdAt-aiv-X9sRbMSfXYXQ 提取码:7agw web模板: 链接:https://pan.baidu.com/s/1A ...
- 实时监控文件变化以及处理xml(仅用作笔记用,防止以后要用)
private static void WatcherStrat(string path, string filter) { try { FileSystemWatcher watcher = new ...
- bootstrap editable初始化后表单可修改数据
function loadData() { var url = "${ctx }/sys/marketing/product/page"; $('#tablepager').boo ...
- 利用pymysql同时修改两张表的数据
使用pymysql操作数据库中相关联的两张表需求:两张表中分别有一个字段是json格式,需要往json中再插入一个属性值’container_cloud’=’fasle’. import pymysq ...
- Buffer-Overflow Vulnerability Lab
实验概述 Buffer overflow 定义 Buffer overflow is defined as the condition in which a program attempts to ...