深度和广度优先算法

全排列的深度优先算法:

#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;
}

  

posted @ 2016-03-14 17:47  wujixing909  阅读(295)  评论(0编辑  收藏  举报