深度和广度优先算法
全排列的深度优先算法:
#include <iostream> using namespace std; int a[10],book[10],n; void dfs(int step) { int i; if(step==n+1) { for(i=1;i<=n;i++) cout<<a[i]; cout<<endl; return; } for(i=1;i<=n;i++) { if(book[i]==0) { a[step]=i; book[i]=1; dfs(step+1); book[i]=0; } } return; } int main() { cin>>n; dfs(1); system("pause"); return 0; }
123+456=789的问题深度优先算法:
#include <iostream> using namespace std; int a[10],book[10],total=0;; void dfs(int step) { int i; if(step==10) { if(a[1]*100+a[2]*10+a[3]+a[4]*100+a[5]*10+a[6]==a[7]*100+a[8]*10+a[9]) { total++; cout<<a[1]<<a[2]<<a[3]<<"+"<<a[4]<<a[5]<<a[6]<<"="<<a[7]<<a[8]<<a[9]<<endl; } return; } for(i=1;i<=9;i++) { if(book[i]==0) { a[step]=i; book[i]=1; dfs(step+1); book[i]=0; } } return; } int main() { dfs(1); cout<<total/2<<endl; system("pause"); return 0; }
迷宫问题的深度优先算法:
#include <iostream> using namespace std; int n,m,p,q, mini=99999999; int a[51][51], book[51][51]; void dfs(int x,int y, int step) { int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; int tx,ty,k; if(x==p&&y==q) { if(step<mini) mini=step; return; } for(k=0;k<=3;k++) { tx=x+next[k][0]; ty=y+next[k][1]; if(tx<1||tx>n||ty<1||ty>m) continue; if(a[tx][ty]==0&&book[tx][ty]==0) { book[tx][ty]=1; dfs(tx,ty,step+1); book[tx][ty]=0; } } return; } int main() { FILE *stream; freopen_s(&stream,"sample_input.txt", "r", stdin); int i,j,startx,starty; cin>>n>>m; for(i=1;i<=n;i++) for(j=1;j<=m;j++) cin>>a[i][j]; cin>>startx>>starty>>p>>q; book[startx][starty]=1; dfs(startx,starty,0); cout<<mini; fclose(stdin); system("pause"); return 0; }
迷宫问题的广度优先算法:
#include <iostream> using namespace std; struct node { int x; int y; int f; //f父亲在队列中的编号, 输出路径用 int step; }; int main() { struct node que[2501]; int a[51][51]={0}; int book[51][51]={0}; int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; int head,tail; int i,j,k,n,m,startx,starty,p,q,tx,ty,flag; cout<<"Please input the bianjie:"; cin>>n>>m; cout<<"Please input the array:"; for(i=1;i<=n;i++) for(j=1;j<=m;j++) cin>>a[i][j]; cout<<"please input the startx, starty, p,q:"; cin>>startx>>starty>>p>>q; //队列初始化 head=1; tail=1; //往队列插入迷宫入口坐标 que[tail].x=startx; que[tail].y=starty; que[tail].f=0; que[tail].step=0; tail++; book[startx][starty]=1; flag=0; while(head<tail) { for(k=0;k<=3;k++) { tx=que[head].x+next[k][0]; ty=que[head].y+next[k][1]; if(tx<1||tx>n||ty<1||ty>m) continue; if(a[tx][ty]==0&&book[tx][ty]==0) { book[tx][ty]=1; que[tail].x=tx; que[tail].y=ty; que[tail].f=head; que[tail].step=que[head].step+1; tail++; } if(tx==p&&ty==q) { flag=1; break; } } if(flag==1) break; head++; } cout<<que[tail-1].step<<endl; system("pause"); return 0; }
海岛问题深度优先算法:
#include <iostream> using namespace std; int a[51][51], book[51][51],n,m,sum; void dfs(int x,int y) { int k, tx,ty, next[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; for(k=0;k<=3;k++) { tx=x+next[k][0]; ty=y+next[k][1]; if(tx<1||tx>n||ty<1||ty>m) continue; if(a[tx][ty]>0&&book[tx][ty]==0) { sum++; book[tx][ty]=1; dfs(tx,ty); } } return; } int main() { FILE *stream; freopen_s(&stream,"sample_input.txt", "r", stdin); //freopen_s(&stream,"sample_output.txt", "w", stdout); int i,j,startx,starty; cin>>n>>m>>startx>>starty; for(i=1;i<=n;i++) for(j=1;j<=m;j++) cin>>a[i][j]; book[startx][starty]=1; sum=1; dfs(startx,starty); cout<<sum<<endl; fclose(stdin); //fclose(stdout); system("pause"); return 0; }
海岛广度优先算法:
#include <iostream> using namespace std; struct node { int x; int y; }; int main() { struct node que[2501]; int a[51][51]={0}; int book[51][51]={0}; int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; int head,tail; int i,j,k,n,m,startx,starty,p,q,tx,ty,sum,max=0; cout<<"Please input n,m,startx, starty:"; cin>>n>>m>>startx>>starty; cout<<"Please input the array:"; for(i=1;i<=n;i++) for(j=1;j<=m;j++) cin>>a[i][j]; //队列初始化 head=1; tail=1; //往队列插入降落起始坐标 que[tail].x=startx; que[tail].y=starty; tail++; book[startx][starty]=1; sum=1; while(head<tail) { for(k=0;k<=3;k++) { tx=que[head].x+next[k][0]; ty=que[head].y+next[k][1]; if(tx<1||tx>n||ty<1||ty>m) continue; if(a[tx][ty]>0&&book[tx][ty]==0) { sum++; book[tx][ty]=1; que[tail].x=tx; que[tail].y=ty; tail++; } } head++; } cout<<sum<<endl; system("pause"); return 0; }
判断有几个连续岛屿:
#include <iostream> #include <iomanip> using namespace std; int a[51][51], book[51][51],n,m,sum,area=0; void dfs(int x,int y,int color) { int k, tx,ty, next[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; a[x][y]=color; for(k=0;k<=3;k++) { tx=x+next[k][0]; ty=y+next[k][1]; if(tx<1||tx>n||ty<1||ty>m) continue; if(a[tx][ty]>0&&book[tx][ty]==0) { sum++; book[tx][ty]=1; dfs(tx,ty,color); book[tx][ty]=0; } } return; } int main() { FILE *stream; freopen_s(&stream,"sample_input.txt", "r", stdin); freopen_s(&stream,"sample_output.txt", "w", stdout); int i,j,num=0; cin>>n>>m; for(i=1;i<=n;i++) for(j=1;j<=m;j++) cin>>a[i][j]; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { if(a[i][j]>0) { sum=1; num--; book[i][j]=1; dfs(i,j,num); cout<<"每个岛屿的面积为:"<<sum<<endl; area+=sum; } } } for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { cout<<setw(3)<<a[i][j]<<" "; } cout<<endl; } cout<<"有"<<-num<<"个小岛"<<endl; cout<<"总面积为"<<area<<endl; fclose(stdin); fclose(stdout); //fclose(stdout); system("pause"); return 0; }
炸弹人深度优先:
#include <iostream> using namespace std; char a[20][20]; int book[20][20], maxi, mx, my, n, m; int getnum(int i, int j){ int x, y, sum=0; x = i; y = j; while(a[x][y] != '#') { if(a[x][y] == 'G') sum++; x--; } x = i; y = j; while(a[x][y] != '#') { if(a[x][y] == 'G') sum++; x++; } x = i; y = j; while(a[x][y] != '#') { if(a[x][y] == 'G') sum++; y--; } x = i; y = j; while(a[x][y] != '#') { if(a[x][y] == 'G') sum++; y++; } return sum; } void dfs(int x, int y) { int next[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; int k, sum, tx, ty; sum = getnum(x, y); if(sum > maxi) { maxi = sum; mx = x; my = y; } for(k=0; k<4; k++) { tx = x + next[k][0]; ty = y + next[k][1]; //判断边界 if(tx<0 || tx > n-1 || ty < 0 || ty > n-1) continue; //判断墙和是否走过 if(a[tx][ty] != '.' || book[tx][ty] != 0) continue; book[tx][ty] = 1; dfs(tx, ty); } return; } int main(){ FILE *stream; freopen_s(&stream,"sample_input.txt", "r", stdin); int i, startx, starty; cin>>n>>m>>startx>>starty; for(i=0; i<n; i++) { cin>>a[i]; } book[startx][starty] = 1; maxi = getnum(startx, starty); mx = startx; my = starty; dfs(startx, starty); cout<<"将炸弹放置在("<<mx<<","<<my<<")处, 可以消灭"<<maxi<<"个敌人"; fclose(stdin); system("pause"); return 0; }
炸弹人广度优先:
#include <iostream> using namespace std; struct Note { int x; int y; }; char a[20][20]; int getnum(int i, int j){ int x, y, sum=0; x = i; y = j; while(a[x][y] != '#') { if(a[x][y] == 'G') sum++; x--; } x = i; y = j; while(a[x][y] != '#') { if(a[x][y] == 'G') sum++; x++; } x = i; y = j; while(a[x][y] != '#') { if(a[x][y] == 'G') sum++; y--; } x = i; y = j; while(a[x][y] != '#') { if(a[x][y] == 'G') sum++; y++; } return sum; } int main() { FILE *stream; freopen_s(&stream,"sample_input.txt", "r", stdin); struct Note que[401]; int head=1, tail=1; int book[20][20] = {0}; int i, k, tx, ty, startx, starty, sum, max=0, mx, my, m, n; int next[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; cin>>n>>m>>startx>>starty; for(i=0; i<n; i++) { cin>>a[i]; } que[tail].x = startx; que[tail].y = starty; tail++; book[startx][starty] = 1; max = getnum(startx, starty); mx = startx; my = starty; while(head < tail) { for(k = 0; k< 4; k++) { tx = que[head].x + next[k][0]; ty = que[head].y + next[k][1]; if(tx<0 || tx>n-1 || ty<0 || ty>n-1) continue; if(a[tx][ty]=='.'&&book[tx][ty]==0) { book[tx][ty] = 1; que[tail].x = tx; que[tail].y = ty; tail++; sum = getnum(tx, ty); if(sum > max) { max = sum; mx = tx; my = ty; } } } head++; } cout<<"将炸弹放置在("<<mx<<","<<my<<")处, 可以消灭"<<max<<"个敌人"; fclose(stdin); system("pause"); return 0; }