目录
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.
*/