马踏棋盘+贪心,结果没有效果。有空的帮忙看看算法有错没。该如何处理
马踏棋盘+贪心,结果没有效果。。有空的帮忙看看算法有错没。。
------解决方案--------------------
坐等高手
------解决方案--------------------
你可以优先跳靠外面的点,速度可以快很多
------解决方案--------------------
外面就是靠近边界的,里面就是靠近中心的
------解决方案--------------------
xuexiyixia
------解决方案--------------------
- C/C++ code
#include <iostream> #include <stack> #include <vector> #include <algorithm> using namespace std; typedef struct { int x; int y; }Direc;//横向x,纵向y,右正,下正 Direc direc[8]={{1,-2},{-1,-2},{-2,-1},{-2,1},{-1,2},{1,-2},{2,1},{2,-1}}; //贪心选择数组元素类 class Greed_Select { friend class Stack_Node; friend class Horse; public: bool operator < (Greed_Select &p) { return way_out<p.way_out; } private: int to_x,to_y; int way_out;//如果此跳点没有出路 }; class Stack_Node//栈结点类 { friend class Horse; public: Stack_Node(int x,int y):_x(x),_y(y),_cnt(0) { } private: int _x,_y; vector<Greed_Select> _to_go;//数组中元素为上边的那个类 int _cnt;//记录该走第几条贪心选择 }; class Horse { public: Horse() { for(int i=0;i<=8;++i) for(int j=0;j<=8;++j) flag[i][j]=0; } void begin() { Stack_Node *start=new Stack_Node(1,1);//从左上角开始跳 _stack.push(start); flag[1][1]=1; _get_greed_select(start); while(!_stack.empty())//用栈深搜+贪心策略 { if(_stack.size()==64)//栈中有64个点,说明整个棋盘都跳过了,找到一种路径,打印,退出. { cout<<"找到一种路径"<<endl; return; } Stack_Node *p=_stack.top(); if(p->_cnt==8||p->_to_go[p->_cnt].way_out==999)//所有邻接跳点都遍历过,退栈.(包括8方向全部遍历过以及从当前点无法到达剩余方向的情况) { flag[p->_x][p->_y]=0; _stack.pop(); delete p; } else//按贪心策略访问还没访问过的邻接跳点 { int tx=p->_to_go[p->_cnt].to_x; int ty=p->_to_go[p->_cnt].to_y; ++p->_cnt; Stack_Node *q=new Stack_Node(tx,ty); flag[tx][ty]=1; _get_greed_select(q); _stack.push(q); } } if(_stack.empty()) { cout<<"没有路径"<<endl; } } void _get_greed_select(Stack_Node *p) { int tx,ty,count; for(int i=0;i<=7;++i) { tx=p->_x+direc[i].x; ty=p->_y+direc[i].y; if(test_bound(tx,ty)&&flag[tx][ty]==0)//能跳过去的邻接跳点,计算出口数量 { count=0; for(int j=0;j<=7;++j) { if(test_bound(tx+direc[j].x,ty+direc[j].y)&&flag[tx+direc[j].x][ty+direc[j].y]==0) { ++count; } } Greed_Select temp; temp.to_x=tx; temp.to_y=ty; temp.way_out=count; p->_to_go.push_back(temp); } else//跳不过去的邻接跳点 { Greed_Select temp; temp.to_x=-1; temp.to_y=-1; temp.way_out=999; p->_to_go.push_back(temp); } } sort(p->_to_go.begin(),p->_to_go.end()); } bool test_bound(int x,int y) { return (x>0)&(x<9)&(y>0)&(y<9); } private: stack<Stack_Node*> _stack; unsigned char flag[9][9]; }; int main() { Horse test; test.begin(); }
------解决方案--------------------
坐等高手
------解决方案--------------------
你可以优先跳靠外面的点,速度可以快很多
------解决方案--------------------
外面就是靠近边界的,里面就是靠近中心的
------解决方案--------------------
xuexiyixia
------解决方案--------------------