广度搜索与深度搜索
图的记录:
- 邻接表
- 邻接矩阵
BFS
DFS
char board[10][15];
int k,n;
bool vis[10]={};
int f(int r,int m) {//当前已经搜索到第r行,还应再放m个棋子
if(m<=0) return 1;
if(r==n) return 0;
int res=f(r+1,m);
for(int i=0; i<n; i++)
if(!vis[i]&&board[r][i]=='#') {
vis[i]=true;
res+=f(r+1,m-1);
vis[i]=false;
}
return res;
}
精髓:DFS
int next[8][2]= {{-2,-1},
{-2,1},
{-1,-2},
{-1,2},
{1,-2},
{1,2},
{2,-1},
{2,1}}; //八个方向,有顺序要求
if(cot==p*q) //边界条件
{
win=1;
return;
}
for(int i=0;i<=7;i++)
{
int tx=next[i][0]+x; //上表起作用了,枚举下一步
int ty=next[i][1]+y;
if(tx<1||tx>p||ty<1||ty>q) //越界返回
continue;
if(flag[tx][ty]==0&&!win)
{
flag[tx][ty]=1; //标记该步已经走了
dfs(tx,ty,cot+1); //深入下一步
flag[tx][ty]=0; //来到这里说明上一步失败了,取消该步访问,即回溯
}
}
精髓:BFS
struct node
{
int x, step;
};
queue<node> Q;
while(!Q.empty())
{
node tmp;
tmp=Q.front();
Q.pop();
x=tmp.x;
stp=tmp.step;
}
if((!vis[tep])&&(tep!=x)&&(prime[tep]))
Q.push(temp);