DFS BFS《

基础概念
概念

  1. 再解炸弹人

输入格式:
第一行4个整数为n m x y,分别n和m表示迷宫的行和列,x和y表示小人的起始坐标(从0行0列开始计算),接下来的n行m列为地图。
1<=n,m<=50
输出格式:
最多可以消灭的敌人数。

BFS《一层一层
https://bbs.codeaha.com/problem-12034.html
字符数组的读入又又又忘了都是从0开始的,WAWAWA

#include<stdio.h>
char a[55][55];
int book[55][55],m,n;
struct note{
    int x;
    int y;
}que[2501];
int get(int x,int y){
    int i,j,sum=0;
    i=x;
     
    while(i>=0){
        if(a[i][y]=='#') break;
        if(a[i][y]=='G') sum++;
        i--;
         
    }
    i=x;
    while(i<m){
            if(a[i][y]=='#') break;
        if(a[i][y]=='G') sum++;
        i++;
    }
    j=y;
    while(j<n){
            if(a[x][j]=='#') break;
        if(a[x][j]=='G') sum++;
        j++;
    }
    j=y;
    while(j>=0){
            if(a[x][j]=='#') break;
        if(a[x][j]=='G') sum++;
        j--;
    }
    return sum;
}
int main(){
    int sx,sy,head,tail,tx,ty;
    int next[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
    scanf("%d%d%d%d",&m,&n,&sx,&sy);
    int i;
    for(i=0;i<m;i++){
        scanf("%s",a[i]);
    }
    head=tail=0;
    book[sx][sy]=1; 
    que[tail].x=sx;
    que[tail].y=sy;
    tail++;
    int max=get(sx,sy);
    while(head<tail){
        for(i=0;i<4;i++){
            tx=que[head].x +next[i][0];
            ty=que[head].y +next[i][1];
            if(tx<0||tx>m-1||ty<0||ty>n-1) continue;
            if(book[tx][ty]==0&&a[tx][ty]=='.'){
            	max=max>get(tx,ty)?max:get(tx,ty);
                book[tx][ty]=1;
                que[tail].x =tx;
                que[tail].y =ty;
                tail++;
            }
         
        }
        head++;
    }
   
    printf("%d",max);
    return 0;
     
     
}

2.举出1-N的位每位不同的数
BFS*《不撞南墙不回头*

#include<stdio.h>
int a[10],book[10],n;//C语言全局变量为0 ,无需赋值 
void dfs(int step){//step 表示现在在第几位
	int i; 
	if(step==n+1) {
		for(i=1;i<=n;i++){
			printf("%d ",a[i]);
		}
		printf("\n");
		return ;//返回最近一次调用 函数的位置 
	} 
	for(i=1;i<=n;i++){
		if(book[i]==0){
			book[i]=1;//book标记为已经用过了 
			a[step]=i;//将I放到第step位 
			dfs(step+1);//自己调用自己 
			book[i]=0; //**** 表示该数字又可用 
		}
	}
	return ;
}
int main(){
	scanf("%d",&n);
	dfs(1);//首先在第一位上 
	return 0;
}

3.XXX+XXX=XXX《每位都不同
DFS

#include<stdio.h>
int a[10],book[10];
void dfs(int step){
	int i;
	if(step==10){
		if(a[1]*100+a[4]*100+a[2]*10+a[5]*10+a[3]+a[6]==a[7]*100+a[8]*10+a[9]){
			printf("%d%d%d +%d%d%d=%d%d%d",a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
			printf("\n");
		}
		return ;
	}
	
	for(i=1;i<10;i++){
		if(book[i]==0){
			book[i]=1;
			a[step]=i;
			dfs(step+1);
			book[i]=0;
		}
	}
	return ;
}
int main(){
	dfs(1);
	return 0;
}

迷宫问题(SX,SY)————》(P,Q)
DFS

#include<stdio.h>
int a[51][51],book[51][51],m,n,p,q,min=999999;
void dfs(int x,int y,int step){
	int tx,ty,i;
	if(x==p&&y==q){
		if(step<min) min=step;
		return ;
	}
	int next[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
	for(i=0;i<4;i++){
		tx=x+next[i][0];
		ty=y+next[i][1];
		if(tx<1||tx>m||ty<1||ty>n) continue;
		if(book[tx][ty]==0&&a[tx][ty]==0){
			book[tx][ty]=1;
			dfs(tx,ty,step+1);
			book[tx][ty]=0; 
		}
		
	}
	return ;
} 
int main(){
	int sx,sy;
	scanf("%d%d",&m,&n);
	int i,j;
	for(i=1;i<=m;i++){
		for(j=1;j<=n;j++){
			scanf("%d",&a[i][j]);
		}
	} 
	scanf("%d%d%d%d",&sx,&sy,&p,&q);
	dfs(sx,sy,0);
	printf("%d",min);
	return 0;
}

BFS

#include<stdio.h>
int a[101][101],book[101][101];
struct note {
	int x;
	int y;
	int f;
	int s;
	
};
int main(){
	struct note  que[10001];//50*50的可能性 
	int next[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
	int sx,sy,tx,ty,m,n,p,q,i,j,tail,head,flag=0;
	scanf("%d%d",&m,&n);
	for(i=1;i<=m;i++){
		for(j=1;j<=n;j++){
			scanf("%d",&a[i][j]);
		}
	}
	scanf("%d%d%d%d",&sx,&sy,&p,&q);
	tail=head=0;
	book[sx][sy]=0; 
	que[tail].x=sx;
	que[tail].y =sy;
	que[tail].s =0;
	que[tail].f=0;
	tail++;
	while(head<tail){
		for(i=0;i<4;i++){
			tx=que[head].x +next[i][0];
			ty=que[head].y+next[i][1];
			if(tx<1||tx>m||ty<1||ty>n) continue;
			if(book[tx][ty]==0&&a[tx][ty]==0){
				book[tx][ty]=1;
				que[tail].x =tx;
				que[tail].y =ty;
				que[tail].s =que[head].s +1;
				que[tail].f =head;//存放路径 
				tail++;
			}
			if(tx==p&&ty==q) {
				flag=1;
				break;
			}
		}
		if(flag) break;
		head++;//对下一个点进行拓展 
	}
	if(flag!=1) printf("No Way!") ;
	else 
	printf("%d",que[tail-1].s );
	return 0;
} 

6.BFS
宝岛探险
BFS————

#include<stdio.h>
int a[101][101],book[101][101],m,n;
struct note{
	int x;
	int y;

}que[10001];
int main(){
	int sx,sy,tx,ty,head,tail,i,j,s=1;
	int next[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
	
	scanf("%d%d%d%d",&m,&n,&sx,&sy);
	for(i=1;i<=m;i++){
		for(j=1;j<=n;j++){
			scanf("%d",&a[i][j]);
		}
	}
	head=tail=0;
	que[tail].x =sx;
	que[tail].y =sy;
	tail++;
	book[sx][sy]=1;
	while(head<tail){
		for(i=0;i<4;i++){
			tx=que[head].x +next[i][0];
			ty=que[head].y +next[i][1];
			if(tx<1||tx>m||ty<1||ty>n){
				continue;
			}
			if(book[tx][ty]==0&&a[tx][ty]>0) {
				book[tx][ty]=1;
				s++;
				que[tail].x =tx;
				que[tail].y =ty;
				tail++;
				
			}
		}
		head++;
	} 

	printf("%d",s);
	return 0;
}

DFS——————

#include<stdio.h>
int a[101][101],book[101][101],m,n,s;
void dfs(int x,int y){
	int tx,ty,i;
	int next[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
	for(i=0;i<4;i++){
		tx=x+next[i][0];
		ty=y+next[i][1];
		if(tx<1||tx>m||ty<1||ty>n) continue;
		if(book[tx][ty]==0&&a[tx][ty]>0){
			book[tx][ty]=1;
			s++;
			dfs(tx,ty);
	
		}
	}
	return ;
} 
int main(){
	int sx,sy,i,j;
	
	
	scanf("%d%d%d%d",&m,&n,&sx,&sy);
	for(i=1;i<=m;i++){
		for(j=1;j<=n;j++){
			scanf("%d",&a[i][j]);
		}
	}
	
	book[sx][sy]=1;
	dfs(sx,sy);
	printf("%d",s+1);
	return 0;
}

着色法DFS

找出最大岛

通过循环%3d 打出不同的岛的置不同《-1,-2.。。。。》,
然后-num的值就是的岛的个数。

#include<stdio.h>

int a[101][101],book[101][101],m,n,s,sum;
void dfs(int x,int y,int num){
	int tx,ty,i;
	a[x][y]=num;
	int next[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
	for(i=0;i<4;i++){
		tx=x+next[i][0];
		ty=y+next[i][1];
		if(tx<1||tx>m||ty<1||ty>n) continue;
		if(book[tx][ty]==0&&a[tx][ty]>0){
			book[tx][ty]=1;
			sum++;
			dfs(tx,ty,num);
	
		}
	}
	
	return ;
} 
int main(){
	int i,j;
	
	int num=0;
	scanf("%d%d",&m,&n);
	for(i=1;i<=m;i++){
		for(j=1;j<=n;j++){
			scanf("%d",&a[i][j]);
		}
	}
	for(i=1;i<=m;i++){
		for(j=1;j<=n;j++){
			if(a[i][j]>0){
				num--;
				sum=1;
				book[i][j]=1;
				dfs(i,j,num);
			}
			if(sum>s) s=sum;
		}
	}

	printf("%d",s);
	
	return 0;
}

其实并没有写完

猜你喜欢

转载自blog.csdn.net/weixin_43880084/article/details/85042598