1. 程式人生 > 其它 >馬攔過河卒 dfs

馬攔過河卒 dfs

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; }