馬攔過河卒 Time Limit: 3000MS Memory Limit: 65536KB Submit Statistic PRoblem Description
棋盤上A點(diǎn)有一個(gè)過河卒,需要走到目標(biāo)B點(diǎn)。卒行走的規(guī)則:可以向下、或者向右。同時(shí)在棋盤上C點(diǎn)有一個(gè)對(duì)方的馬,該馬所在的點(diǎn)和所有跳躍一步可達(dá)的點(diǎn)稱為對(duì)方馬的控制點(diǎn)。因此稱之為“馬攔過河卒”。棋盤用坐標(biāo)表示,A點(diǎn)(0,0)、B點(diǎn)(n,m)(n,m為不超過15的整數(shù)),同樣馬的位置坐標(biāo)是需要給出的。現(xiàn)在要求你計(jì)算出卒從A點(diǎn)能夠到達(dá)B點(diǎn)的路徑的條數(shù),假設(shè)馬的位置是固定不動(dòng)的,并不是卒走一步馬走一步。
Input
一行四個(gè)數(shù)據(jù),用空格分隔,分別表示B點(diǎn)的坐標(biāo)和馬的坐標(biāo)。
Output
一個(gè)數(shù)據(jù),表示所有的路徑條數(shù)。
Example Input
6 6 3 3
Example Output
6
#include <bits/stdc++.h>using namespace std;int main(){ int g[20][20]={0}; long long int f[20][20]={0}; int dx[9]={0,-2,-1,1,-2,2,1,-1,2}; int dy[9]={0,-1,-2,-2,1,1,2,2,-1}; int n,m,x,y,i,j; cin>>n>>m>>x>>y; g[x][y]=1; for(i=1;i<=8;i++) { if((x+dx[i]>=0)&&(x+dx[i]<=n)&&(y+dy[i]>=0)&&(y+dy[i]<=m)) { g[x+dx[i]][y+dy[i]]=1; } } for(i=1;i<=n;i++) { if(g[i][0]!=1) f[i][0]=1; else for(;i<=n;i++) { f[i][0]=0; } } for(j=1;j<=m;j++) { if(g[0][j]!=1) f[0][j]=1; else for(;j<=m;j++) { f[0][j]=0; } } for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { if(g[i][j]==1) f[i][j]=0; else f[i][j]=f[i-1][j]+f[i][j-1]; } } cout<<f[n][m]<<endl; return 0;}新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注