商人過河 決策
阿新 • • 發佈:2019-02-08
這是上數模老師講的一道題,解法有圖解法和遞迴窮舉的方式,這裡我採用後者。
詳細說明可以參考: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); }