poj2243+poj1915骑士问题
2243是骑士问题,八个格子的,BFS,因为要最短路经,所以没有用A*,A*跑不出来,太慢了,因为要搜索到所有解啊!一直更新最优,而BFS,一层一层搜索,第一次得到的便是最短的了!300格子,标记的话,BFS遍历所有时间复杂度也算可以!500MS过!稍微剪枝即可!时间注意!要标记每层已经走过的情况时候要在入队的时候标记!大大降低复杂度!因为出队的时候,有些已经在队里了,但是还没有被标记,现在又让他入队!
1915,也是简单BFS过的,暴搜即可。标记一下。但是先用启发搜索怎么也过不了,TLE,用跑2W次就结束,但是WA,悲剧,用欧几里得距离作启发函数啊,奇怪,在几步之内到达目标附近,可能不是最优解了,因为这样不能像一层一层那样标记了,只能更新最小的情况!很多剪枝的时候要注意语句顺序!还有更新与剪枝的顺序!
#include<iostream> //bfs
#include<string>
#include<queue>
#include<cstring>
using namespace std;
int absnum(int x,int y)
{
if(x>y) return x-y;
else return y-x;
}
bool mark[8][8];
int a[8][8];
int f[8][2]={-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2,-2,-1};
int minpath=15;
struct xy
{
int x,y;
int count;
};
void bfs(string from,string end)
{
queue<xy>q;
xy start;
start.x=from[0]-'a';
start.y=from[1]-'1';
start.count=0;
q.push(start);
int endx=end[0]-'a';
int endy=end[1]-'1';
if((start.x==endx&&absnum(start.y,endy)==1)||(start.y==endy&&absnum(start.x,endx)==1))
{
minpath=3;return;
}
while(!q.empty())
{
xy getfront=q.front();q.pop();
mark[getfront.x][getfront.y]=1;
if(getfront.count>6)return; //无启发可以这样,一层一层,最多走7次。
if(getfront.x==endx&&getfront.y==endy)
{
if(minpath>getfront.count)minpath=getfront.count;
}
for(int i=0;i<8;i++)
{
xy next(getfront);
next.x+=f[i][0];
next.y+=f[i][1];
if(next.x>=0&&next.x<8&&next.y>=0&&next.y<8&&mark[next.x][next.y]==0)
{
if(next.count>minpath)continue; //已经多了就不用了
next.count++;
q.push(next);
mark[next.x][next.y]=1; //在这里标记! }
}
}
}
int main()
{
string from,end;
while(cin>>from>>end)
{
minpath=15;
memset(mark,0,sizeof(mark));
bfs(from,end);
cout<<"To get from "<<from<<" to "<<end<<" takes "<<minpath<<" knight moves."<<endl;
}
return 0;
}
#include<iostream> //bfs1915爆搜过
#include<string>
#include<queue>
#include<cstring>
#include<cmath>
using namespace std;
int absnum(int x,int y)
{
if(x>y) return (x-y);
else return (y-x);
}
int mark[301][301];
int f[8][2]={-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2,-2,-1};
int minpath=300;
struct xy
{
int x,y;
int count;
double juli;
bool operator <(const xy &a)const
{
return a.juli<juli;
}
};
double hamit(xy f,xy e)
{
double res=0;
int tx=absnum(f.x,e.x);
int ty=absnum(f.y,e.y);
res=sqrt(0.0+tx*tx+ty*ty);
return res;
}
xy from,end;int daxiao;
void bfs(xy from,xy end)
{
priority_queue<xy>q;
xy start;
start.x=from.x;
start.y=from.y;
start.count=0;
start.juli=hamit(start,end);
q.push(start);
mark[start.x][start.y]=-1;
int counted=0;
while(!q.empty())
{
xy getfront=q.top();
counted++;
q.pop();
if(counted>10000)
{
if(hamit(getfront,end)>6)continue;
}
if(getfront.x==end.x&&getfront.y==end.y)
{
if(minpath>getfront.count)
{
minpath=getfront.count;
}
continue;
}
for(int i=0;i<8;i++)
{
xy next(getfront);
next.x+=f[i][0];
next.y+=f[i][1];
if(next.x>=0&&next.x<daxiao&&next.y>=0&&next.y<daxiao&&next.count<mark[next.x][next.y])
{
next.juli=hamit(next,end);
next.count++;
if(next.count>=minpath)continue; //比最优差,剪枝!
if(next.count>daxiao/2+3)continue;
if(mark[next.x][next.y]>next.count)
{
mark[next.x][next.y]=next.count;
}
if(next.x==end.x&&next.y==end.y)
{
if(minpath>next.count)
{
minpath=next.count;
}
continue;
}
q.push(next);
}
}
}
return;
}
int main()
{
int na;cin>>na;
while(na--)
{
cin>>daxiao;
cin>>from.x>>from.y>>end.x>>end.y;
minpath=daxiao;
memset(mark,0x3f3f3f3f,sizeof(mark));
bfs(from,end);
cout<<minpath<<endl;
}
return 0;
}
#include<iostream> //bfs,A*/WA不解ing
#include<string>
#include<queue>
#include<cstring>
#include<cmath>
using namespace std;
int absnum(int x,int y)
{
if(x>y) return (x-y);
else return (y-x);
}
int mark[301][301];
int f[8][2]={-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2,-2,-1};
int minpath=300;
struct xy
{
int x,y;
int count;
double juli;
bool operator <(const xy &a)const
{
return a.juli<juli;
}
};
double hamit(xy f,xy e)
{
double res=0;
int tx=absnum(f.x,e.x);
int ty=absnum(f.y,e.y);
res=sqrt(0.0+tx*tx+ty*ty);
return res;
}
xy from,end;int daxiao;
void bfs(xy from,xy end)
{
priority_queue<xy>q;
xy start;
start.x=from.x;
start.y=from.y;
start.count=0;
start.juli=hamit(start,end);
q.push(start);
mark[start.x][start.y]=-1;
// int counted=0;
while(!q.empty())
{
xy getfront=q.top();
// counted++;
//cout<<counted<<"kkk"<<endl;
q.pop();
/* if(counted>20000) //到达2W次,差不多可以出来!
{
return;
}*/
// cout<<getfront.count<<":"<<getfront.x<<"-"<<getfront.y<<endl;
// if( mark[getfront.x][getfront.y]>getfront.count) mark[getfront.x][getfront.y]=getfront.count;
for(int i=0;i<8;i++)
{
xy next(getfront);
next.x+=f[i][0];
next.y+=f[i][1];
if(next.x>=0&&next.x<daxiao&&next.y>=0&&next.y<daxiao)
//有优先队列后已经不是BFS本质,步数多的以及访问过,少的还可访问!不是简单标记!
{
next.juli=hamit(next,end);
next.count++;
if(next.count>=mark[next.x][next.y])continue; //注意这几个语句之间顺序!continue很重要!
mark[next.x][next.y]=next.count;
if(next.x==end.x&&next.y==end.y)
{
if(minpath>next.count)
{
minpath=next.count;
}
continue;
}
if(next.count>=minpath)continue; //比最优差,剪枝!
// if(next.count>daxiao/2+3)continue;
q.push(next);
}
}
}
return;
}
int main()
{
int na;cin>>na;
while(na--)
{
cin>>daxiao;
cin>>from.x>>from.y>>end.x>>end.y;
minpath=daxiao;
memset(mark,0x3f3f3f3f,sizeof(mark));
bfs(from,end);
cout<<minpath<<endl;
}
return 0;
}
poj2243+poj1915骑士问题的更多相关文章
- COGS746. [网络流24题] 骑士共存
骑士共存问题«问题描述:在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘 上某些方格设置了障碍,骑士不得进入. «编程任务:对于给定的n*n个方格的国际象棋棋盘和障碍标志 ...
- 【BZOJ1671】[Usaco2005 Dec]Knights of Ni 骑士 BFS
[Usaco2005 Dec]Knights of Ni 骑士 Description 贝茜遇到了一件很麻烦的事:她无意中闯入了森林里的一座城堡,如果她想回家,就必须穿过这片由骑士们守护着的森林.为 ...
- 骑士游历/knight tour - visual basic 解决
在visual baisc 6 how to program 中文版第七章的练习题上看到了这个问题,骑士游历的问题. 在8x8的国际象棋的棋盘上,骑士(走法:一个方向走两格,另一个方向一格)不重复走完 ...
- BZOJ1085: [SCOI2005]骑士精神 [迭代加深搜索 IDA*]
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1800 Solved: 984[Submit][Statu ...
- BZOJ 1040 【ZJOI2008】 骑士
Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火 ...
- 【BZOJ-1040】骑士 树形DP + 环套树 + DFS
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3312 Solved: 1269[Submit][Status ...
- BZOJ1040 [ZJOI2008]骑士
Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各 界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战 ...
- BFS 骑士的移动
骑士的移动 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83498#problem/E 题目: Description A f ...
- LA 3523 圆桌骑士
题目链接:http://vjudge.net/contest/141787#problem/A http://poj.org/problem?id=2942 此题很经典 知识点:DFS染色,点-双连通 ...
随机推荐
- Javaweb学习笔记10—文件上传与下载
今天来讲javaweb的第10阶段学习.文件的上传与下载,今天主要说的是这个功能的实现,不用说了,听名字就是外行人也知道肯定很重要啦. 老规矩,首先先用一张思维导图来展现今天的博客内容. ...
- Redis学习笔记(三)列表进阶
RPOPLPUSH source destination(弹出source列表最右端的元素,并推入destination的最左端,同时返回这个元素) BRPOPLPUSH source destina ...
- 实战角度比较EJB2和EJB3的架构异同
] EJB编程模型的简化 首先,EJB3简化的一个主要表现是:在EJB3中,一个EJB不再象EJB2中需要两个接口一个Bean实现类,虽然我们以前使用JBuilder这样可视化开发工具自动生成了EJB ...
- 推荐一个高大上的网易云音乐命令行播放工具:musicbox
网易云音乐上有很多适合程序猿的歌单,但是今天文章介绍的不是这些适合程序员工作时听的歌,而是一个用Python开发的开源播放器,专门适用于网易云音乐的播放.这个播放器的名称为MusicBox, 特色是用 ...
- Android(java)学习笔记177: 服务(service)之音乐播放器
1.我们播放音乐,希望在后台长期运行,不希望因为内存不足等等原因,从而导致被gc回收,音乐播放终止,所以我们这里使用服务Service创建一个音乐播放器. 2.创建一个音乐播放器项目(使用服务) (1 ...
- Android(java)学习笔记170:服务(service)之服务的生命周期 与 两种启动服务的区别
1.之前我们在Android(java)学习笔记171:Service生命周期 (2015-08-18 10:56)说明过,可以回头看看: 2.Service 的两种启动方法和区别: (1)Servi ...
- (转)关于treap的板子理解
关于treap的板子理解: 关于结构体的定义:(一般平衡树无法理解的变量名):v:节点的值:size:子节点的个数(包括自己):cnt:相同的值的副本数:l:左儿子:r:右儿子: 右旋:父亲变成左儿子 ...
- clone对象或数组
function clone(obj) { var o; if (typeof obj == "object") { if (obj === null) { o = null; } ...
- RN传参的问题
RN父组件通过props属性给子组件传参,假设参数 target={target} 子组件在render函数里 let { target } = this.props; 如果子组件有个 FlatLis ...
- Ubuntu中python链接本地数据库
由于python链接数据库需要下载DB API模块:例如你需要访问Mysql数据,你需要MySQL数据库模块. DB-API是一个规范. 以便为不同的底层数据库系统和数据库接口程序提供一致的访问接口. ...