2024.8.8学习笔记

目录

BFS

1.奇怪的电梯

2.分可乐

3.跳象棋


BFS

1.奇怪的电梯

/*奇怪的电梯*/ 
#include<bits/stdc++.h>
using namespace std;
#define MAX 1001
int a[MAX],bj[MAX]; 
int n,x,y;//n为楼层数,x为起始位置,y为目标位置
struct ALu{
	int d_a; //记录当前位置
	int d_b; //当前移动次数 
};
void bfs(){
	ALu L,next; 
	L.d_a=x;//记录起始位置 
	L.d_b=0;//移动次数为0
	bj[x]=1;//标记当前位置走过 
	queue<ALu> qu;//队列处理BFS问题
	qu.push(L);//入队
	while(!qu.empty()){
		L=qu.front();//记录队首 
		qu.pop();//并将队首出队
		if(L.d_a==y){//当前出来的队首是否为目标位置 
			cout<<L.d_b<<endl;
			return ; 
		} 
		next.d_a=L.d_a+a[L.d_a];//向上移动 
		next.d_b=L.d_b+1;//当前移动次数=上一次移动次数+1
		if(next.d_a<=n){
			if(bj[next.d_a]==0){//当前楼层还未经过 
				bj[next.d_a]=1;//标记当前楼层已经过
				qu.push(next);//入队(存储当前楼层位置) 
			}
		} 
		next.d_a=L.d_a-a[L.d_a];//向下移动
		next.d_b=L.d_b+1;//移动次数+1
		if(next.d_a>=1){
			if(bj[next.d_a]==0){
				bj[next.d_a]=1;
				qu.push(next);
			}
		}
	} 
	cout<<"-1"<<endl;//无法到达目标位置
	return ; 
}
void solve(){
	cin>>n>>x>>y;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];//该楼层能向上或向下移动a[i]层
		bj[i]=0;//初始化n层楼还未走过 
	}
	bfs();
} 
int main(){
	int T=1;
	//cin>>T;
	while(T--){
		solve();
	}
	return 0;
}
/*
输入 
6 1 3
3 3 2 2 2 3
输出 
3 
*/ 

2.分可乐

/*分可乐*/
//一瓶可乐S,两个杯子分别为N、M(S=N+M) 
#include<bits/stdc++.h>
using namespace std;
#define MAX 101
int bj[MAX][MAX][MAX];
int S,N,M;
struct ALu{
	int s,n,m; 
	int d_b;//记录次数 
}k;//k开始位置 
void bfs(){
	ALu L,next;
	k.s=S,k.n=0,k.m=0;
	L.d_b=0;
	bj[S][0][0]=1;
	queue<ALu> qu;
	qu.push(k);
	while(!qu.empty()){
		L=qu.front();
		qu.pop();
		if((L.s==L.n&&L.m==0)||(L.s==0&&L.m==L.n)||(L.s==L.m&&L.n==0)){
			cout<<L.d_b<<endl;
			return ;
		}
		//s倒n 
		if(L.s>N-L.n){
			next.s=L.s-(N-L.n);//当前s中的容量 
			next.n=N;//当前n中的容量
			next.m=L.m;//当前m中的容量
			next.d_b=L.d_b+1;
			if(next.s>=0&&next.s<=S&&next.n>=0&&next.n<=N&&next.m>=0&&next.m<=M){
				if(bj[next.s][next.n][next.m]==0){
					bj[next.s][next.n][next.m]=1;
					qu.push(next);
				}
			}
		}
		else{
			next.s=0;//当前s中的容量 
			next.n=L.n+L.s;//当前n中的容量
			next.m=L.m;//当前m中的容量
			next.d_b=L.d_b+1;
			if(next.s>=0&&next.s<=S&&next.n>=0&&next.n<=N&&next.m>=0&&next.m<=M){
				if(bj[next.s][next.n][next.m]==0){
					bj[next.s][next.n][next.m]=1;
					qu.push(next);
				}
			}
		}
		//s倒m
		if(L.s>M-L.m){
			next.s=L.s-(M-L.m);//当前s中的容量 
			next.n=L.n;//当前n中的容量
			next.m=M;//当前m中的容量
			next.d_b=L.d_b+1;
			if(next.s>=0&&next.s<=S&&next.n>=0&&next.n<=N&&next.m>=0&&next.m<=M){
				if(bj[next.s][next.n][next.m]==0){
					bj[next.s][next.n][next.m]=1;
					qu.push(next);
				}
			}
		}
		else{
			next.s=0;//当前s中的容量 
			next.n=L.n;//当前n中的容量
			next.m=L.m+L.s;//当前m中的容量
			next.d_b=L.d_b+1;
			if(next.s>=0&&next.s<=S&&next.n>=0&&next.n<=N&&next.m>=0&&next.m<=M){
				if(bj[next.s][next.n][next.m]==0){
					bj[next.s][next.n][next.m]=1;
					qu.push(next);
				}
			}
		}
		//n倒s
		next.s=L.s+L.n;//当前s中的容量 
		next.n=0;//当前n中的容量
		next.m=L.m;//当前m中的容量
		next.d_b=L.d_b+1;
		if(next.s>=0&&next.s<=S&&next.n>=0&&next.n<=N&&next.m>=0&&next.m<=M){
			if(bj[next.s][next.n][next.m]==0){
				bj[next.s][next.n][next.m]=1;
				qu.push(next);
			}
		}
		//m倒s
		next.s=L.s+L.m;//当前s中的容量 
		next.n=L.n;//当前n中的容量
		next.m=0;//当前m中的容量
		next.d_b=L.d_b+1;
		if(next.s>=0&&next.s<=S&&next.n>=0&&next.n<=N&&next.m>=0&&next.m<=M){
			if(bj[next.s][next.n][next.m]==0){
				bj[next.s][next.n][next.m]=1;
				qu.push(next);
			}
		}
		
		//n倒m 
		if(L.n>M-L.m){
			next.s=L.s;//当前s中的容量 
			next.n=L.n-(M-L.m);//当前n中的容量
			next.m=M;//当前m中的容量
			next.d_b=L.d_b+1;
			if(next.s>=0&&next.s<=S&&next.n>=0&&next.n<=N&&next.m>=0&&next.m<=M){
				if(bj[next.s][next.n][next.m]==0){
					bj[next.s][next.n][next.m]=1;
					qu.push(next);
				}
			}
		}
		else{
			next.s=L.s;//当前s中的容量 
			next.n=0;//当前n中的容量
			next.m=L.m+L.n;//当前m中的容量
			next.d_b=L.d_b+1;
			if(next.s>=0&&next.s<=S&&next.n>=0&&next.n<=N&&next.m>=0&&next.m<=M){
				if(bj[next.s][next.n][next.m]==0){
					bj[next.s][next.n][next.m]=1;
					qu.push(next);
				}
			}
		}
		//m倒n
		if(L.m>N-L.n){
			next.s=L.s;//当前s中的容量 
			next.n=N;//当前n中的容量
			next.m=L.m-(N-L.n);//当前m中的容量
			next.d_b=L.d_b+1;
			if(next.s>=0&&next.s<=S&&next.n>=0&&next.n<=N&&next.m>=0&&next.m<=M){
				if(bj[next.s][next.n][next.m]==0){
					bj[next.s][next.n][next.m]=1;
					qu.push(next);
				}
			}
		}
		else{
			next.s=L.s;//当前s中的容量 
			next.n=L.m+L.n;//当前n中的容量
			next.m=0;//当前m中的容量
			next.d_b=L.d_b+1;
			if(next.s>=0&&next.s<=S&&next.n>=0&&next.n<=N&&next.m>=0&&next.m<=M){
				if(bj[next.s][next.n][next.m]==0){
					bj[next.s][next.n][next.m]=1;
					qu.push(next);
				}
			}
		}
	}	
	cout<<"No"<<endl;
	return ;
}
void solve(){
	while(cin>>S>>N>>M){
		if(S!=N+M||S==0) break;
		memset(bj,0,sizeof(bj));
		bfs();		
	}
}
int main(){
	int T=1;
	//cin>>T;
	while(T--){
		solve();
	}
	return 0;
}
/*
Input
7 4 3
4 1 3
Output
No
3 
*/ 

3.跳象棋

/*跳象棋*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 101
string s_begin,s_end;
int bj[MAX][MAX];
int x_begin,y_begin,x_end,y_end;
struct ALu{
	int d_x,d_y;//当前位置 
	int d_b;//移动的步数 
}b,m;//b起始位置,m终点位置 
void bfs(){
	memset(bj,0,sizeof(bj));
	ALu L,next;
	b.d_x=x_begin,b.d_y=y_begin;
	m.d_x=x_end,m.d_y=y_end;
	L.d_b=0;
	bj[x_begin][y_begin]=1; 
	queue<ALu> qu;
	qu.push(b);
	while(!qu.empty()){
		L=qu.front();
		qu.pop();
		if(L.d_x==m.d_x&&L.d_y==m.d_y){
			cout<<"To get from "<<s_begin<<" to "<<s_end<<" takes "<<L.d_b<<" knight moves."<<endl;
			return ;
		} 
		//左下(x-1,y+2) 
		next.d_x=L.d_x-1;
		next.d_y=L.d_y+2;
		next.d_b=L.d_b+1;
		if(next.d_x>=0&&next.d_y<=MAX){
			if(bj[next.d_x][next.d_y]==0){
				bj[next.d_x][next.d_y]=1;
				qu.push(next);
			}
		}
		//左下(x-2,y+1) 
		next.d_x=L.d_x-2;
		next.d_y=L.d_y+1;
		next.d_b=L.d_b+1;
		if(next.d_x>=0&&next.d_y<=MAX){
			if(bj[next.d_x][next.d_y]==0){
				bj[next.d_x][next.d_y]=1;
				qu.push(next);
			}
		} 
		//左上(x-2,y-1)
		next.d_x=L.d_x-2;
		next.d_y=L.d_y-1;
		next.d_b=L.d_b+1;
		if(next.d_x>=0&&next.d_y>=0){
			if(bj[next.d_x][next.d_y]==0){
				bj[next.d_x][next.d_y]=1;
				qu.push(next);
			}
		}
		//左上(x-1,y-2)
		next.d_x=L.d_x-1;
		next.d_y=L.d_y-2;
		next.d_b=L.d_b+1;
		if(next.d_x>=0&&next.d_y>=0){
			if(bj[next.d_x][next.d_y]==0){
				bj[next.d_x][next.d_y]=1;
				qu.push(next);
			}
		} 
		//右上(x+1,y-2) 
		next.d_x=L.d_x+1;
		next.d_y=L.d_y-2;
		next.d_b=L.d_b+1;
		if(next.d_x<=MAX&&next.d_y>=0){
			if(bj[next.d_x][next.d_y]==0){
				bj[next.d_x][next.d_y]=1;
				qu.push(next);
			}
		} 
		//右上(x+2,y-1)
		next.d_x=L.d_x+2;
		next.d_y=L.d_y-1;
		next.d_b=L.d_b+1;
		if(next.d_x<=MAX&&next.d_y>=0){
			if(bj[next.d_x][next.d_y]==0){
				bj[next.d_x][next.d_y]=1;
				qu.push(next);
			}
		}
		//右下(x+2,y+1)
		next.d_x=L.d_x+2;
		next.d_y=L.d_y+1;
		next.d_b=L.d_b+1;
		if(next.d_x<=MAX&&next.d_y<=MAX){
			if(bj[next.d_x][next.d_y]==0){
				bj[next.d_x][next.d_y]=1;
				qu.push(next);
			}
		}
		//右下(x+1,y+2)
		next.d_x=L.d_x+1;
		next.d_y=L.d_y+2;
		next.d_b=L.d_b+1;
		if(next.d_x<=MAX&&next.d_y<=MAX){
			if(bj[next.d_x][next.d_y]==0){
				bj[next.d_x][next.d_y]=1;
				qu.push(next);
			}
		}  
	}
	cout<<"-1"<<endl;
	return ;
} 
void solve(){
	cin>>s_begin>>s_end;
		for(int i=0;i<s_begin.size();i++){
			if(s_begin[i]>='0'&&s_begin[i]<='9'){
				y_begin=y_begin*10+s_begin[i]-'0';
			}
			else{
				x_begin=s_begin[i]-'a';
			}
		}
		for(int i=0;i<s_end.size();i++){
			if(s_end[i]>='0'&&s_end[i]<='9'){
				y_end=y_end*10+s_end[i]-'0';
			}
			else{
				x_end=s_end[i]-'a';
			}
		}
//		cout<<x_begin<<' '<<y_begin<<endl;
//		cout<<x_end<<' '<<y_end<<endl;
		bfs();
}
int main(){
	int T=1;
	//cin>>T;
	while(T--){
		solve();
	}
	return 0;
}
/*
Input 
a1 h8
Output
To get from a1 to h8 takes 6 knight moves.
*/ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值