#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 << ' ' ;
}
}
过河问题 (人、狼、羊、菜) cs精英挑战营 OJ c++
最新推荐文章于 2023-02-26 15:59:14 发布