馬攔過河卒
time limit: 3000 ms memory limit: 65536 kib
problem description
棋盤上a點有乙個過河卒,需要走到目標b點。卒行走的規則:可以向下、或者向右。同時在棋盤上c點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為「馬攔過河卒」。棋盤用座標表示,a點(0,0)、b點(n,m)(n,m為不超過15的整數),同樣馬的位置座標是需要給出的。現在要求你計算出卒從a點能夠到達b點的路徑的條數,假設馬的位置是固定不動的,並不是卒走一步馬走一步。
input
一行四個資料,用空格分隔,分別表示b點的座標和馬的座標。
output
乙個資料,表示所有的路徑條數。
sample input
6 6 3 3
sample output
hint
#include
#include
using
namespace
std;
int main()
{ long
long arr[20][20];
int ctr[20][20],n,i,m,j,x,y;
cin >> n >> m >> x >> y;
for(i=0;i<=n;i++)
for(j=0;j<=m;j++)
ctr[i][j]=1;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
arr[i][j]=0;
ctr[x][y] = 0;
ctr[x-1][y-2] = 0;
ctr[x+1][y-2] = 0;
ctr[x-2][y-1] = 0;
ctr[x+2][y-1] = 0;
ctr[x-2][y+1] = 0;
ctr[x+2][y+1] = 0;
ctr[x-1][y+2] = 0;
ctr[x+1][y+2] = 0;
for(i=1;i<=n;i++)
if(ctr[i][0]!=0)
arr[i][0]=1;
else
for(;i<=n;i++)
arr[i][0]=0;
for(i=1;i<=m;i++)
if(ctr[0][i]!=0)
arr[0][i]=1;
else
for(;i<=m;i++)
arr[0][i]=0;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(ctr[i][j]==1)
arr[i][j]=arr[i-1][j]+arr[i][j-1];
cout
<< arr[n][m] 《這題你應該很容易解出來,可是為什麼總是解不出來呢?
你還混亂座標的概念,橫豎和陣列沒有直接的關係,(a,b),你陣列非用[b][a]
來表示出來,因為在你腦海中一直將陣列第一位對應行數,這其實完全沒有必要,你可以用[a][b]
來表示相關數值。
還有控制點的判斷,其實不用判斷是否在盤內,如果不符合應該不會實現賦值的,直接大膽的賦值就好。
SDUT 1265 馬停下過河卒 DFS
time limit 3000ms memory limit 65536k 有疑問?點這裡 棋盤上a點有乙個過河卒,須要走到目標b點。卒行走的規則 可以向下 或者向右。同一時候在棋盤上c點有乙個對方的馬,該馬所在的點和全部跳躍一步可達的點稱為對方馬的控制點。因此稱之為 馬攔過河卒 棋盤用座標表示,a...
SDUT 馬攔過河卒
time limit 3000ms memory limit 65536k 棋盤上a點有乙個過河卒,需要走到目標b點。卒行走的規則 可以向下 或者向右。同時在棋盤上c點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為 馬攔過河卒 棋盤用座標表示,a點 0,0 b點 n...
1265 馬攔過河卒 dfs
problem description 棋盤上a點有乙個過河卒,需要走到目標b點。卒行走的規則 可以向下 或者向右。同時在棋盤上c點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為 馬攔過河卒 棋盤用座標表示,a點 0,0 b點 n,m n,m為不超過15的整數 同樣...