谁能写下代码,我想参考一下
老伯伯拿着鱼,带狗.猫过河到对岸. 有一条船. 只能坐一个人.老伯每次只能带一样动物过河. 当老伯不在的时侯
狗会咬猫.猫会吃鱼. 请问怎么顺序过河呢? 请写出流程图. 最好附上代码
------------------------------------
建立了一个矩阵:0--狗,1---猫,2---鱼,矩阵元素为1表示两种动物不能相处,为0表示可以相处
狗 猫 鱼
狗 0 1 0
猫 1 0 1
鱼 0 1 0
[解决办法]
#include <iostream>
#include <string>
using namespace std;
enum {
DOG=0,
CAT,
FISH
};
int preference[3]= {0, 0, 0};
void InitArray(short (*a)[3]){
for(int ix=0; ix <3; ix++)
for(int iy=0; iy <3; iy++){
*(*(a+ix)+iy)= ((ix==1) || (iy==1)) ? 1 : 0;
}
a[1][1]=0;
}
bool clash(short *p, short (*a)[3]){
int x=0, y=0, time =0;
for(int ix=0; ix <3; ix++){
if(p[ix]){
time++;
((time==1) ? x : y )= ix;
}
}
if(time==1)
return false;
else
return (a[x][y] ) ? true : false;
}
void print(short *i, short *b){
string name[3]={ "dog ", "cat ", "fish "};
for(int ix=0; ix <3; ix++){
cout < <(i[ix] ? name[ix] : " ")
< < "\t --------- ---------\t "
< <(b[ix] ? name[ix] : " ") < <endl;
}
cout < <endl;
}
int findfirst(short *p){
int result=0, first=100;
for(int ix=0; ix <3; ix++){
if(p[ix]){
if(first==100){
first = preference[ix];
result = ix;
}
else if(first > preference[ix]){
first = preference[ix];
result = ix;
}
}
}
return result;
}
bool solve(short *i, short *b, short (*a)[3]){
bool loc = true;
while(i[0] || i[1] || i[2]){
if(loc){
int ix= findfirst(i);
if(i[ix]){
i[ix]=0, b[ix]=1;
preference[ix]++;
if(clash(i, a)){
i[ix]=1, b[ix]=0;
}else{
loc=false;
print(i,b);
}
}
}
else{
int ix= findfirst(b);
if(b[ix]){
if(clash(b, a)){
preference[ix]++;
b[ix]=0, i[ix]=1;
}else{
loc=true;
}
}
}
}
return true;
}
int main(){
short relate[3][3]; //relate talbe
short init_relate[3]={1, 1, 1};
short bank_relate[3]={0, 0, 0};
InitArray(relate); //initial matrix
solve(init_relate, bank_relate, relate);
cout < < "ok! " < <endl;
return 0;
}
自己动手写了一个,望大家批评指出....^_^