过河问题 (人、狼、羊、菜) cs精英挑战营 OJ c++

在这里插入图片描述

#include<iostream>
#include<iomanip>
using namespace std;

struct state{int H,W,S,V;};

state s[20]; //记录状态转移过程,原案的数量
int choice[20] = {0}; //记录状态转移过程的决策号
int k;

state d[5]={{0,0,0,0},{1,0,0,0},{1,1,0,0},{1,0,1,0},{1,0,0,1}}; //0号决策不用,1-4号决策会用

void display();
void transfer_state();

int main(){
    transfer_state();
    display();
    return 0;    
}

void transfer_state(){
    k = 1; // 设置初始状态为1
    s[1].H = 1; s[1].W = 1; s[1].S = 1; s[1].V = 1;

    do{
        int fx = 1;
        if( k%2 == 1 ) fx = -1;

        int i; //决策号
        for(i=choice[k+1]+1; i <= 4; i++){
            int u = s[k].H + fx * d[i].H;			// 按第i号策略走1步后,HWSV数目
		    int v = s[k].W + fx * d[i].W;
            int x = s[k].S + fx * d[i].S;			
		    int y = s[k].V + fx * d[i].V;

            if(u>1 || u<0 || v>1 || v<0 || x>1 || x<0 || y>1 || y<0) continue;

            bool AQ = (u == 0 && v == 1 && x == 1) || (x == 1 && y == 1 && u == 0) || (u==1&&x==0&&y==0)||(u==1&&v==0&&x==0);
            if(AQ) continue;

            bool CHF = false;
            for(int j=k-1; j >= 1; j -= 2)
                if(s[j].H==u && s[j].W==v && s[j].S==x && s[j].V==y) CHF = true;
            if(CHF) continue;

            k++;
            s[k].H = u;			// 按第i号策略走1步后,HWSV数目
		    s[k].W = v;
            s[k].S = x;			
		    s[k].V = y;
            choice[k] = i;
            break;
        }
        if(i>5){choice[k+1]=0;k--;}
    }while(! (s[k].H==0 && s[k].W==0 && s[k].S==0 && s[k].V==0) );
}

void display(){
    for(int i = 1; i <= k; i++){
        if( d[choice[i]].H == 1 ) cout << 'H';
        if( d[choice[i]].W == 1 ) cout << 'W';
        if( d[choice[i]].S == 1 ) cout << 'S';
        if( d[choice[i]].V == 1 ) cout << 'V';
        cout << ' ' ;
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值