zoukankan      html  css  js  c++  java
  • 深度和广度优先算法

    全排列的深度优先算法:

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

      

  • 相关阅读:
    【反演复习计划】【bzoj2154】Crash的数字表格
    【反演复习计划】【bzoj3529】数表
    【反演复习计划】【bzoj3994】DZY loves maths
    【反演复习计划】【bzoj3994】约数个数和
    【反演复习计划】【bzoj2818】gcd
    【反演复习计划】【bzoj1011】zap-queries
    BZOJ3991: [SDOI2015]寻宝游戏
    BestCoder Round #75
    BZOJ4417: [Shoi2013]超级跳马
    BZOJ4416: [Shoi2013]阶乘字符串
  • 原文地址:https://www.cnblogs.com/wujixing/p/5276561.html
Copyright © 2011-2022 走看看