文章目录
- 深度优先
- 1.算法模板
- 2.例题
- 2.1 n 皇后问题(洛谷)
- 2.2 素数环(洛谷)
- 2.3 全排列(洛谷)
- 2.4 马的遍历(洛谷)
- 广度优先
- 1.算法模板
- 2.例题
- 2.1 Dungeon Master(洛谷)
- 2.2走迷宫
- 2.3 Knight Moves(洛谷)
深度优先
1.算法模板
void dfs(int i)
{
if ( 1.到达推出条件 ) {
}
for ( 2.遍历所有可能 ) {
if ( 3.满足走向下一层条件 ) {
4.
5.dfs(i+1);
6.
}
}
}
2.例题
2.1 n 皇后问题(洛谷)
#include
using namespace std;
bool row[20], line[20], incline_left[40], incline_right[40];
int sum;
int order[20];
int n;
int times = 3;
void print()
{
sum++;
if (times > 0) {
cout << order[1];
for (int i = 2; i <= n; i++)
cout << ' ' << order[i];
cout << endl;
}
times--;
}
void dfs(int i)
{
if (i > n) {
print();
return;
}
for (int j = 1; j <= n; j++) {
if (!line[j] && !incline_left[i+j] && !incline_right[n-1-j+i]) {
order[i] = j;
line[j] = 1;
incline_left[i + j] = 1;
incline_right[n - 1 - j + i] = 1;
dfs(i+1);
line[j] = 0;
incline_left[i + j] = 0;
incline_right[n - 1 - j + i] = 0;
order[i] = 0;
}
}
}
int main()
{
cin >> n;
dfs(1);
cout << sum;
}
2.2 素数环(洛谷)
#include
using namespace std;
int a[20] = {0,1}, isp[40];
int T, n;
bool vis[20] = {0,1};
void dfs(int x,int op)
{
if(x == n+1 && isp[a[n]+a[1]]) {
for(int i = 1; i < n; i++) printf("%d ",a[i]);
printf("%d\n", a[n]);
}
if(x == n+1) return ;
for(int i = op; i <= n; i += 2)
if(!vis[i] && isp[i+a[x-1]]) {
a[x] = i;
vis[i] = 1;
dfs(x+1, op^3);
vis[i] = 0;
}
}
int main()
{
isp[2] = isp[3]=isp[5]=isp[7]=isp[11]=isp[13]=isp[17]=isp[19]=isp[23]=isp[29]=isp[31]=1;
while(scanf("%d",&n)!=EOF)
{
if(T) printf("\n");
printf("Case %d:\n",++T);
dfs(2,2);
}
return 0;
}
2.3 全排列(洛谷)
#include
using namespace std;
int n,pd[100],used[100];
void print()
{
int i;
for(i=1;i<=n;i++)
printf("%5d",used[i]);
cout<<endl;
}
void dfs(int k)
{
int i;
if(k==n)
{
print();
return;
}
for(i=1;i<=n;i++)
{
if(!pd[i])
{
pd[i]=1;
used[k+1]=i;
dfs(k+1);
pd[i]=0;
}
}
}
int main()
{
cin>>n;
dfs(0);
return 0;
}
2.4 马的遍历(洛谷)
#include
using namespace std;
struct queue_
{
int x,y;
} que[160010];
int head=0,tail=1,get[401][401],n,m,sx,sy;
int fx[16]={2,-2,2,-2,-1,1,-1,1},fy[16]={1,1,-1,-1,2,2,-2,-2};
int main()
{
cin >> n >> m >> sx >> sy;
for(int i=1; i <= n; ++i)
for(int j=1; j <= m; ++j)
get[i][j] =-1;
get[sx][sy]=0;
que[1].x=sx;
que[1].y=sy;
while(head < tail)
{
head++;
int s=get[que[head].x][que[head].y]+1;
for(int i=0; i<8; ++i)
{
int nx = que[head].x+fx[i], ny=que[head].y+fy[i];
if(nx>=1 && nx<=n && ny>=1 && ny<=m && get[nx][ny] == -1)
{
tail++;
que[tail].x=nx;
que[tail].y=ny;
get[nx][ny]=s;
}
}
}
for(int i=1; i<=n; ++i)
{
for(int j=1; j<=m; ++j)
printf("%-5d", get[i][j]);
cout<<endl;
}
return 0;
}
广度优先
1.算法模板
1. queue<T> q;
2. q.push(head)
3. whlie(!q.empty()) {
4. int T = q.top();
5. q.pop()
6. for ( 遍历所有可能 ) {
7. if ( 满足条件 ) {
8. q.push( now )
9.
10. }
11. }
12. }
2.例题
2.1 Dungeon Master(洛谷)
#include
using namespace std;
int a[105][105][105],n,m,o;
char p;
int dx[15]={0,0,0,0,1,-1};
int dy[15]={0,0,1,-1,0,0};
int dz[15]={1,-1,0,0,0,0};
struct kk
{
int x;
int y;
int z;
int step;
};
kk q[1000005];
bool check(int x,int y,int z)
{
if(x<1 || x>n || y<1 || y>m || z<1 || z>o)
return 0;
if(a[x][y][z])
return 0;
return 1;
}
void bfs(int x1,int y1,int z1,int x2,int y2,int z2)
{
int head=1,tail=1;
bool flag=1;
q[1].x=x1;
q[1].y=y1;
q[1].z=z1;
q[1].step=0;
a[x1][y1][z1]=1;
while(head<=tail)
{
for(int i=0;i<6;i++)
{
int tx=q[head].x+dx[i];
int ty=q[head].y+dy[i];
int tz=q[head].z+dz[i];
if(check(tx,ty,tz))
{
tail++;
q[tail].x=tx;
q[tail].y=ty;
q[tail].z=tz;
q[tail].step=q[head].step+1;
a[tx][ty][tz]=1;
if(tx==x2 && ty==y2 && tz==z2)
{
printf("Escaped in %d minute(s).\n",q[tail].step);
flag=0;
}
}
}
head++;
}
if(flag)
printf("Trapped!\n");
return;
}
int main()
{
int x1,y1,z1,x2,y2,z2;
while(1)
{
memset(a,0,sizeof(a));
cin>>n>>m>>o;
if(n==0 && m==0&& o==0)
break;
else
{
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
for(int k=1;k<=o;++k)
{
cin>>p;
if(p=='.')
a[i][j][k]=0;
else if(p=='#')
a[i][j][k]=1;
else if(p=='S')
{
a[i][j][k]=0;
x1=i;
y1=j;
z1=k;
}
else if(p=='E')
{
a[i][j][k]=0;
x2=i;
y2=j;
z2=k;
}
}
bfs(x1,y1,z1,x2,y2,z2);
}
}
return 0;
}
2.2走迷宫
#include
using namespace std;
int a[17][17],s[17][17],n,m,bx,by,ex,ey;
const string c[16]={"0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"};
bool flag;
void dfs(int bx,int by,string ans){
if(bx==ex&&by==ey){cout<<ans<<endl;flag=1;}
int d[4][2]={{0,-1},{-1,0},{0,1},{1,0}};
for(int i=0;i<4;i++){
int x=bx+d[i][0],y=by+d[i][1];
if(a[x][y]==1&&s[x][y]==0){
s[x][y]=s[bx][by]+1;
dfs(x,y,ans+"->"+"("+c[x]+","+c[y]+")");
s[x][y]=0;
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)cin>>a[i][j];
cin>>bx>>by>>ex>>ey;s[bx][by]=1;
dfs(bx,by,"("+c[bx]+","+c[by]+")");
if(!flag)cout<<-1<<endl;
return 0;
}
2.3 Knight Moves(洛谷)
#include
#include
#include
using namespace std;
const int N=10;
char a[N],b[N];
int dx[N]={-1,-2,-2,-1,1,2,2,1};
int dy[N]={-2,-1,1,2,2,1,-1,-2};
struct horse{
int x,y,t;
}st,ed,tmp;
int dis[N][N],vis[N][N];
inline int bfs()
{
if(st.x==ed.x&&st.y==ed.y) return 0;
queue<horse> q1;
queue<horse> q2;
vis[st.x][st.y]=1;
vis[ed.x][ed.y]=2;
q1.push(st);
q2.push(ed);
int fx,fy,xx,yy;
while(true){
if(q1.size()<q2.size()){
fx=q1.front().x;
fy=q1.front().y;
for(int i=0;i<8;i++){
xx=fx+dx[i];yy=fy+dy[i];
if(xx<1||xx>8||yy<1||yy>8) continue;
if(vis[xx][yy]==0){
tmp.t=q1.front().t+1;
tmp.x=xx;tmp.y=yy;
q1.push(tmp);
vis[xx][yy]=1;
dis[xx][yy]=tmp.t;
}
else if(vis[xx][yy]==2)
return dis[xx][yy]+q1.front().t+1;
}q1.pop();
}
else{
fx=q2.front().x;
fy=q2.front().y;
for(int i=0;i<8;i++){
xx=fx+dx[i];yy=fy+dy[i];
if(xx<1||xx>8||yy<1||yy>8) continue;
if(vis[xx][yy]==0){
tmp.t=q2.front().t+1;
tmp.x=xx;tmp.y=yy;
q2.push(tmp);
vis[xx][yy]=2;
dis[xx][yy]=tmp.t;
}
else if(vis[xx][yy]==1)
return dis[xx][yy]+q2.front().t+1;
}q2.pop();
}
}
}
int main(void)
{
while(scanf("%s%s",a,b)!=EOF){
st.x=a[0]-'a'+1;st.y=a[1]-'0';
ed.x=b[0]-'a'+1;ed.y=b[1]-'0';
st.t=ed.t=0;
memset(vis,0,sizeof(vis));
memset(dis,0,sizeof(dis));
printf("To get from %c%c to %c%c takes %d knight moves.\n",a[0],a[1],b[0],b[1],bfs());
}
return 0;
}