剪枝:利用bfs低複雜度遍歷估價和最優解比較,剪枝後避免列舉子集造成的高複雜度時間浪費。
利用多次排序從大數開始遍歷,或者利用優先佇列。
dfs+bfs剪枝。
****於網路,易於理解但無法直接ac。
#define _crt_secure_no_warnings
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
struct node
};
int cnt;
int n, m, maxd;//maxd表示答案的長度
#define n 35
#define for(i,n) for(int i=0;i<(n);i++)
int b[n], c[n];//b陣列存放答案,c陣列是當前待嘗試的結果
int vis[n][n];
int a[n][n];//存放輸入的數字,'#'均用0表示
const
int dx = ;
const
int dy = ;
int find(int x, int y)//尋找(x,y)後面最多還有多少個數
return ret;
} bool dfs(int cur, int val, int x, int y, bool same)//當前位置為cur,待填入的值為val,座標為(x,y),same表示cur之前的數字和目前的答案是否完全一致,返回是否更新過答案
int res = maxd - cur; cnt++;//res表示還需要找的數字個數,cnt表示查詢的次數,也作為標記數
if (find(x, y) < res)return
0;//如果剩餘的數字個數《需要的數字個數,剪枝(2)
vector
l;
for(k, 4));//後繼結點都放入l中
} sort(l.begin(), l.end());//排序,從較大的後繼結點開始搜尋
bool o = 0;
for(i, l.size())
return o;
} char st[100];
void solve()
);
maxd++;
} }
} sort(l.begin(), l.end());//將數值較大的結點放到前面
for (; maxd >= 1; maxd--)//從長度最大的開始嘗試,如果無解,換為小一點的,這樣的乙個好處是容易比較大小,可以進行剪枝
if (o)break;//當前答案長度的限制下找到了解,直接break
} for (int i = 1; i <= maxd; i++)
printf("%d", b[i]);
puts("");
} int main()
UVA 11882 dfs搜尋 bfs剪枝
uva 11882 dfs搜尋 bfs剪枝 給你乙個r c的數字矩陣,要求從任意乙個點開始走,只能上下左右走,求走的過數連線起來最大是多少。直接dfs每乙個數字,在每一層dfs中,加上bfs 判斷剩下的數連線起來能否大於當前的ans 不能的話 剪枝了。雖然思路是這樣的,但昨天一直tle,或許姿勢不對...
bfs 大火蔓延的迷宮,UVA 11624
一開始wa了,因為以為只有乙個火源,其實有多個 portions 真的需要加強英語閱讀能力了。解法 這就是乙個加了一些限制條件的迷宮問題,限制條件是迷宮會著火,隨著時間的推移火會蔓延,仔細思考就會發現每個格仔著火的時間是固定而且有跡可循的,如果能預處理出每個格仔著火的時間,那麼問題就已經解決了 只需...
UVA 10099 最大的最小邊。。
題目連線 這個題很yd,之前一直不知道導遊還要佔乙個容量,所以連樣例都搞不懂。悲催。解法是利用floyd演算法,最後求出那條邊之後再做一下出發就ok了 我的 include include includeusing namespace std int n,m int dis 105 105 int ...