馬攔過河卒 dfs
阿新 • • 發佈:2022-03-23
7-1 馬攔過河卒 (20 分)
棋盤上A點有一個過河卒,需要走到目標B點。卒行走的規則:可以向下、或者向右。同時在棋盤上C點有一個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為“馬攔過河卒”。
棋盤用座標表示,A點(0,0)、B點(n,m)(n,m為不超過15的整數),同樣馬的位置座標是需要給出的。現在要求你計算出卒從A點能夠到達B點的路徑的條數,假設馬的位置是固定不動的,並不是卒走一步馬走一步。
輸入格式:
一行四個資料,用空格分隔,分別表示B點的座標和馬的座標。
輸出格式:
一個數據,表示所有的路徑條數。
輸入樣例:
6 6 3 3
輸出樣例:
6
tips: 可以輸出動態規劃的表格來看一下
由自己模擬的影象和 題意中 制定了00 和mn 可以知道,所需的要多一個(非m-1,n-1個,需要0-m,0-n)
//ac #include<stdio.h> #include<stdlib.h> int horseRoute[25][25],soldierRoute[25][25]; // 輸入6 6 3 3 輸出6 總大小 馬的位置 void horse(int x,int y) { horseRoute[x][y]=1; horseRoute[x-1][y+2]=1; horseRoute[x-2][y+1]=1; horseRoute[x-2][y-1]=1; horseRoute[x-1][y-2]=1; horseRoute[x+1][y-2]=1; horseRoute[x+2][y-1]=1; horseRoute[x+2][y+1]=1; horseRoute[x+1][y+2]=1; } int main() { int bx,by,horseX,horseY; scanf("%d %d %d %d",&bx,&by,&horseX,&horseY); // bx=6;by=6;horseX=3,horseY=3; horse(horseX,horseY); soldierRoute[0][0]=1;for(int i=0;i<=bx;i++) for(int j=0;j<=by;j++) if(horseRoute[i][j]!=1&&soldierRoute[i][j]==0) //到達不了 還沒走到 soldierRoute[i][j]=soldierRoute[i-1][j]+soldierRoute[i][j-1]; // for(int i=0;i<bx;i++) // { // for(int j=0;j<by;j++) // printf("%d",soldierRoute[i+1][j+1]); // printf("\n"); // } printf("%d\n",soldierRoute[bx][by]); return 0; }