馬攔過河卒

過河卒(NOIP2002初中組複賽第四題)
問題描述:
棋盤上A點有一個過河卒,需要走到目標B點。卒行走的規則:可以向下或向右。
同時在棋盤上的任一點有一個對方的馬(如圖中的C點),該馬所在的點和所有跳躍一步可達的點稱爲對方馬的控制點。例如圖中C點上的馬可以控制9個點。卒不能走到對方馬的控制點。
棋盤用座標表示,A點座標(0,0)、B點座標(n, m) (n,m爲不超過20的整數,並由鍵盤輸入),同樣馬的位置座標C是需要給出的(C≠A,且C≠B)。現在要求你計算出卒從A點能夠到達B點的路徑條數。
輸入:B點的座標(n, m)以及對方馬的座標(x,y),不用判錯。
輸出:一個整數(路徑的條數)。

樣例:
輸入:6 6 3 2
輸出:17

源代碼:
#include<stdio.h>

int s[21][21];
__int64 c[21][21];
int a0[8]={-2,-2,-1,-1,1,1,2,2};
int b0[8]={1,-1,2,-2,2,-2,1,-1};

int x1,y1;
int x3,y3;

int main()
{
    int x2,y2;
    int i,j;
    int test;
    while((scanf("%d %d %d %d",&x1,&y1,&x3,&y3)!=EOF))
    {
        for(i=0;i<21;i++)
            for(j=0;j<21;j++)
            {
                s[i][j]=1;
                c[i][j]=0;
            }
			s[x3][y3]=0;
			for(i=0;i<8;i++)//計算受馬控制的點
			{
				x2=x3+a0[i];
				y2=y3+b0[i];
				if((x2>=0)&&(y2>=0)&&(y2<=20)&&(x2<=20))
					s[x2][y2]=0;
			}
			test=1;
			for(j=0;j<21;j++)//初始化邊上的走法
			{
				if(test)
				{
					if(s[0][j]==0)
						test=0;
					else
						c[0][j]=1;
				}
			}
			test=1;
			for(j=0;j<21;j++)
			{
				if(test)
				{
					if(s[j][0]==0)
						test=0;
					else
						c[j][0]=1;
				}
			}
			for(i=1;i<21;i++)//計算一個點上的走法,上方點的走法數+左方點的走法數
				for(j=1;j<21;j++)
				{
					if(s[i][j])
						c[i][j]=c[i-1][j]*s[i-1][j]+c[i][j-1]*s[i][j-1];
				}
			printf("%I64d\n",c[x1][y1]);
    }
    return 0;
}

附:程序代碼

發佈了27 篇原創文章 · 獲贊 13 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章