在一个图内进行一系列操作时的优先考虑算法
模板及变形:
DFS
dfs_first
/**first**/
void dfs(参数)
{//适用于 规律性搜索
if (函数终止条件)
return;
if (参数边界判断)
return;
for (扩展方式)
{
参数扩展变化
if (参数合理判断)
{
标记
变化
dfs(变化后参数);
取消标记
取消变化
}
}
}
/************eg:************/
void dfs(int x, int n, int k)
{//利用x——n的数构成k位排列 全排列
if (x == k + 1)
{
for (int i = 1; i <= k; i++)
cout << p[i] << " ";
cout << endl;
return;
}
if (x>n)
return;
for (int i = 1; i <= n; i++)
{
if (vis[i] == false && i > p[x-1])
{
p[x] = i;
vis[i] = true;//标记
dfs(x + 1,n,k);
vis[i] = false;//取消标记
}
}
}
void dfs(int index,int n,int k)
{//通过对数组的n个数据罗列(这里是求和),来判断其值是否符合
if (index == k + 1)
{
if (isprime(sum))//判素
ans++;//计数
/**Test**/
/*
for (int i = 1; i <= index - 1; i++)
cout << p[i] << " ";
cout << endl;
*/
return;
}
for (int i = 1; i <= n; i++)
{
if (vis[i] == false && i > p[index - 1])
{
p[index] = i;
vis[i] = true;//标记
sum += a[i];//变化
dfs(index + 1, n , k );
vis[i] = false;//取消标记
sum -= a[i];//取消变化
}
}
}
dfs_second
/**second**/
bool dfs(参数)
{//适用于道路的搜索
标记
if (函数终止条件)
return true;
if (参数边界判断)
return false;
for (扩展方式)
{
if (参数合理判断)
{
注入
if (dfs(变化参数))
return true;
取消注入
}
}
}
/************eg:************/
bool dfs(int i,int j)
{//数独九宫格
//自带标记
if (i==9&&j==0)
return true;
if (i<0||i>8||j<0||j>8)
return false;
if (Sudoku[i][j] != 0)
return dfs(i + (j == 8), (j + 1) % 9);
for (int n = 1; n < 10; n++)
{
if (judge(n, i, j) != 0)
{
Sudoku[i][j] = n;
if(dfs(i + (j == 8), (j + 1) % 9))
return true;
Sudoku[i][j] = 0;
}
}
return false;
}
int dfs(int x,int y,int r2,int c2,int m,int n)
{//找迷宫图的路(适用求所有路)
vis[x][y]=1;
if (x==r2&&y==c2)
pq.push(lu[x][y]);
if (!(x>=0&&x<m&&y>=0&&y<n))
return 0;
for (int i=0;i<8;i++)
{//这里是马走日 八条路
int cx=x+X[i];
int cy=y+Y[i];
if (!tu[cx][cy]&&!vis[cx][cy])
{
//无注入
if(dfs(cx,cy,r2,c2,m,n))
return 1;
//无取消注入
}
}
}
BFS
bfs_first
待
bfs_second
待