一,經典搜尋(深搜和廣搜)與剪枝
int a[62二,迭代加深搜尋];bool v[62
];int
n;bool bingo=0
;bool cmp(int a,int b)
bool dfs(int begin,int left,int now,int
max)
return0;
}int
main()
intans;
sort(a,a+n,cmp);
memset(v,
0,sizeof
(v));
for(ans=max;ans<=sum/2;ans++)
}if(!bingo) printf("
%d\n
",sum);
}return0;
}
//三,雙向廣搜poj 3921
//給出一張有向圖,問最少刪除幾個點,能使起點到終點的最短距離大於k
/** 先用bfs找到一條最短路,然後列舉刪除每個點。刪除點的時候,可以用迭代加深。
* 先列舉所有刪除k個點的情況,如果無解,則列舉刪除k+1個點的情況 */
#define mm 4010
#define mn 100
struct
edge edge[mm];
inthead[mn], tot;
intn, m, k;
bool rem[mn]; //
false表示該點沒刪除,true表示該刪除了
intpath[mn];
intcpath[mn][mn];
queue
que;
int ite; //
表示迭代次數
int finds; //
表示是否找到解
void addline(int u, int
v) //
在有向圖中利用廣度優先搜尋找路
bool
bfs() }}
return0;
}void dfs(int
deep)
int cnt = 0
;
int v =n;
for (int i = n; v > 1; v =path[v])
cpath[deep][cnt++] =v;
if (cnt >k)
if (deep >ite)
return; //
如果深度到了,也不用找了
for (int i = 1; i < cnt; i++)
}int
solve()
return
n;}
//四,astarpoj 1077 康托展開 雙向廣搜
#define maxn 402880
int first[9] = ;
unsigned
int factorial[11] = ;
char tran[4
];struct
node
};int father[2
][maxn];
int ope[2
][maxn];
int dir[4][2] = , , , }; //
u, l, r, d
bool
checked[2
][maxn];
intmatchingstatus;
intmatchingq;
bool
bfs(node begin, node end)
int another = 1 -next;
node head =q[next].front();
q[next].pop();
if (checked[another][head.order])
else}}
}}
return0;
}
#define maxn 402880五,dfsidint first[9] = ;
char tran[4
];struct
node
void
getorder()
void
getf()
};void geth(node &p)
p.h = tmp * 4; //
1 倍會超時
}int
father[maxn];
intope[maxn];
int dir[4][2] = , , , }; //
u, l, r, d
intchecked[maxn]; //
0未訪問,1在open,2在close
intopendir[maxn], closedir[maxn];
multiset
open, close;
multiset
::iterator it;
bool
bfs(node end)
open.erase(open.begin());
checked[head.order] = 2
; closedir[head.order] =head.f;
x = head.space % 3
; y = head.space / 3
;
for (int i = 0; i < 4; i++)
else
if (checked[tmp.order] == 1
) }
else
if (checked[tmp.order] == 2
) }}}
}return0;
}
#define mm 4010六.博弈樹的極大極小演算法與alpha –beta剪枝#define mn 100
struct
edge edge[mm];
inthead[mn], tot;
intn, m, k;
bool rem[mn]; //
false表示該點沒刪除,true表示該刪除了
intpath[mn];
intcpath[mn][mn];
queue
que;
int ite; //
表示迭代次數
int finds; //
表示是否找到解
void addline(int u, int
v) //
在有向圖中利用廣度優先搜尋找路
bool
bfs() }}
return0;
}void dfs(int
deep)
int cnt = 0
;
int v =n;
for (int i = n; v > 1; v =path[v])
cpath[deep][cnt++] =v;
if (cnt >k)
if (deep >ite)
return; //
如果深度到了,也不用找了
for (int i = 1; i < cnt; i++)
}int
solve()
return
n;}
《博弈知識》
思路:(1)maxfind(min):每次放x,若得到的max大於等於min,則直接返回max。
(2)minfind(max)類似;
(3)因此,列舉第乙個人放的位置,minfind,返回的是inf則勝利。
#include usingnamespace
std;
#define inf 0x3fffffff
int state[5][5
], chess, xi, xj;
bool over(int x, int y)
int minsearch(int, int, int
);int maxsearch(int x, int y, int
min)
return
max;
}int minsearch(int x, int y, int
max)
return
min;
}bool
solve()
}return0;
}int
main()
getchar();
}if (chess < 4)
if (!solve())
printf(
"#####\n");
}return0;
}
窺探PTAM之模板搜尋
在跟蹤執行緒中,使用者變換攝像頭姿態或位置得到新關鍵幀,新關鍵幀需要重新查詢特徵點,找到與上一幀匹配的點以實現點跟蹤。為了快速精確地找到鄰幀對應特徵點,ptam使用一種基於斑塊搜尋的特徵匹配方法。首先從照相機採集一幀灰度影象,由運動估計模型計算乙個估計姿態。將地圖中的特徵點投影到影象上。然後進行斑塊...
窺探記憶體管理
關於記憶體的問題是乙個很初級的問題也是乙個很高深的問題,確切的說是個入門必須了解的問題也是很有內涵的問題。如何認識記憶體,使用記憶體,管理記憶體是乙個一直貫穿於編碼過程的核心問題。拋棄所有的架構概念,剝離覆蓋在軟體開發的迷霧,程式本身只是乙個記憶體中資料不斷的遷移與cpu計算器不斷進行數值運算的過程...
窺探記憶體管理
關於記憶體的問題是乙個很初級的問題也是乙個很高深的問題,確切的說是個入門必須了解的問題也是很有內涵的問題。如何認識記憶體,使用記憶體,管理記憶體是乙個一直貫穿於編碼過程的核心問題。拋棄所有的架構概念,剝離覆蓋在軟體開發的迷霧,程式本身只是乙個記憶體中資料不斷的遷移與cpu計算器不斷進行數值運算的過程...