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;
}

最新文章

  1. 线程池深入(li)
  2. Hadoop 权威指南学习1 (主要框架)
  3. href和src的使用场景
  4. Android --自定义简单Toast
  5. Android 图片的放大缩小拖拉
  6. 传值 属性 block 单例 协议
  7. IT公司100题-9-判断整数序列是不是二元查找树的后序遍历结果
  8. POJ 2236 Wireless Network (并查集)
  9. android中的4种点击事件
  10. 这是您一直期待的所有iOS 11功能的屏幕截图
  11. Day-14: 常用的内建模块
  12. Java语言编程 - 搭建Java开发环境
  13. 用不到 50 行的 Python 代码构建最小的区块链
  14. ubuntu1404安装搜狗输入法
  15. HTML的前世今生
  16. vuex this.$store.state.属性和mapState的属性中的一点点区别
  17. 使用userAgent判断使用的是什么浏览器
  18. 快速排查SQL服务器阻塞语句
  19. pytest的参数化测试
  20. diamond types are not supported at this language level

热门文章

  1. Java练习题01
  2. UVALive 2238 Fixed Partition Memory Management 固定分区内存管理(KM算法,变形)
  3. 51nod 1272 最大距离
  4. how to make a function from using global var to not using it
  5. 关于websocket的代码,实现发送信息和监听信息(前端 后端(node.js))
  6. nodejs 安装 淘宝镜像
  7. JavaEE-07 过滤器和监听器
  8. 阿里云ECS搭建node/mongodb开发环境及部署
  9. C指针复制字符串从一个数组到另一个数组
  10. 文本三剑客之sed