1005: 過河卒
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 50 Solved: 11
[Submit][Status][Web Board]
Description
如圖,A 點有一個過河卒,需要走到目標 B 點。卒行走規則:可以向下、或者向右。同時在棋盤上的任一點有一個對方的馬(如上圖的C點),該馬所在的點和所有跳躍一步可達的點稱爲對方馬的控制點。例如上圖 C 點上的馬可以控制 9 個點(圖中的P1,P2 … P8 和 C)。卒不能通過對方馬的控制點。
棋盤用座標表示,A 點(0,0)、B 點(n,m)(n,m 爲不超過 20 的整數,並由鍵盤輸入),同樣馬的位置座標是需要給出的(約定: C<>A,同時C<>B)。現在要求你計算出卒從 A 點能夠到達 B 點的路徑的條數。
Input
鍵盤輸入
B點的座標(n,m)以及對方馬的座標(X,Y){不用盤錯}
Output
屏幕輸出
一個整數(路徑的條數)。
Sample Input
6 6 3 2
Sample Output
17
#include<iostream>
#include <cmath>
#include "cstdio"
#include <string.h>//string類
/*
這一題的幾個要點:
1、這一題必須將數組改爲long long,否則無法通過。因爲最後的路線可能爲很大,不考慮馬理論極大值爲20的20次方,非常大!!
2、注意爲鍵盤輸入,必須用cin、cout來解答
3、注意邊界
4、game[i][j]=game[i-1][j]+game[i][j-1];
*/
using namespace std;
int main()
{
int Bx,By,Cx,Cy;
//int game[25][25];
long long game[25][25];
//這一題必須用long long
//這一題必須將數組改爲long long,否則無法通過。因爲最後的路線可能爲很大,不考慮馬理論極大值爲20的20次方,非常大!!
//freopen("/Users/qigelaodadehongxiaodi/Desktop/data1.txt", "r", stdin);
//這個不理,是用來方便輸入輸出的東西,利用文本輸入流來讀取數據
//提交代碼的時候記得註銷這條語句
// scanf("%d%d%d%d",&Bx,&By,&Cx,&Cy);
cin>>Bx>>By>>Cx>>Cy;//注意爲鍵盤輸入
for(int i=0;i<=Bx;i++)
for(int j=0;j<=By;j++)
game[i][j]=1;
//將馬佔據的位置設置爲0,注意邊界
//好好檢查,注意不要出錯
game[Cx][Cy]=0;
game[Cx+2][Cy+1]=0;
game[Cx+1][Cy+2]=0;
//只要考慮減的情況不要越界,加的情況不用考慮
if(Cx-2>=0&&Cy-1>=0)game[Cx-2][Cy-1]=0;
if(Cx-2>=0)game[Cx-2][Cy+1]=0;
if(Cy-1>=0)game[Cx+2][Cy-1]=0;
if(Cx-1>=0&&Cy-2>=0)game[Cx-1][Cy-2]=0;
if(Cx-1>=0)game[Cx-1][Cy+2]=0;
if(Cy-2>=0)game[Cx+1][Cy-2]=0;
for(int i=0;i<=Bx;i++){
for(int j=0;j<=By;j++){
if(game[i][j]){//有可能一開始馬就把過河卒吃了
if(i==0&&j==0)continue;
else if(i==0)game[i][j]=game[i][j-1];
else if(j==0)game[i][j]=game[i-1][j];
else game[i][j]=game[i-1][j]+game[i][j-1];
}
}
}
//printf("%d",game[Bx][By]);
cout<<game[Bx][By];
return 0;
}