1. 程式人生 > >商人過河 決策

商人過河 決策

這是上數模老師講的一道題,解法有圖解法和遞迴窮舉的方式,這裡我採用後者。

詳細說明可以參考:http://www.docin.com/p-970116457.html

程式碼:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;
const int maxn=100;
int n;
int vis[maxn][maxn][2];
struct Si{
    int x;
    int y;
    int step;
}s[maxn];

struct Di{
    int x;
    int y;
}d[maxn];


void solve(Si k,int i)
{
    //if(k.x==0&&k.y==0) return step;

    for(int j=0;j<5;j++)
    {int step=k.step;
    s[i+1].x=pow((-1),step)*d[j].x+k.x;
    s[i+1].y=pow((-1),step)*d[j].y+k.y;
    //cout<<"x1:"<<i+1<<" "<<s[i+1].x<<endl;
    //cout<<"y1:"<<i+1<<" "<<s[i+1].y<<endl;
    if((s[i+1].x>=s[i+1].y&&n-s[i+1].x>=n-s[i+1].y)||s[i+1].x==0||n-s[i+1].x==0)
        {
         //cout<<"a"<<endl;
        if(!vis[s[i+1].x][s[i+1].y][step%2]&&s[i+1].x>=0&&s[i+1].y>=0&&s[i+1].x<=n&&s[i+1].y<=n)
    {
        vis[s[i+1].x][s[i+1].y][step%2]=1;
        s[i+1].step=step+1;
        printf("(%d,%d)\n",s[i+1].x,s[i+1].y);
        //cout<<""<<s[i+1].x<<endl;
        //cout<<"y:"<<s[i+1].y<<endl;
        if(s[i+1].x==0&&s[i+1].y==0){printf("step:%d\n",k.step);return;}
        //cout<<"x:"<<s[i+1].x<<endl;
        //cout<<"y:"<<s[i+1].y<<endl;
        solve(s[i+1],i+1);
        break;
    }
    }
    }
}

int main()
{
    memset(vis,0,sizeof(vis));
    scanf("%d",&n);
    s[1].x=n;
    s[1].y=n;
    d[0].x=1;
    d[0].y=1;
    d[1].x=1;
    d[1].y=0;
    d[2].x=0;
    d[2].y=2;
    d[3].x=0;
    d[3].y=1;
    d[4].x=2;
    d[4].y=0;
    vis[s[1].x][s[1].y][1]=1;
    vis[s[1].x][s[1].y][0]=1;
    s[1].step=1;
    solve(s[1],1);
}