商人过河 决策

来源:互联网 发布:淘宝返利网站 编辑:程序博客网 时间:2024/05/21 08:56

这是上数模老师讲的一道题,解法有图解法和递归穷举的方式,这里我采用后者。

详细说明可以参考: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);}

原创粉丝点击