過河卒

或許到了這個時候發這種基礎題 有點蠢 但是 我還真被自己蠢到了
想DFS 剛開始wa wa wa 後來才發現自己腦殘忘記DFS回溯還原了
真憨批 改了之後 又是 t 雖然已經猜到了 我還是乖乖遞推吧

.
.
.
棋盤上A點有一個過河卒,需要走到目標B點。卒行走的規則:可以向下、或者向右。同時在棋盤上的任一點有一個對方的馬(如C點),該馬所在的點和所有跳躍一步可達的點稱爲對方馬的控制點(如圖中的C點和P1,P2,……,P8)。卒不能通過對方馬的控制點。棋盤用座標表示,A點(0,0)、B點(n, m) (n,m爲不超過20的整數),同樣馬的位置座標是需要給出的,C≠A且C≠B。現在輸入B點座標和C點的座標,要你計算出卒從A點能夠到達B點的路徑的條數
在這裏插入圖片描述
DFS

#include<iostream>
#include<cstring>
using namespace std;

int n,m,a,b,count;
long long map[21][21];
int go[2][2]={0,1,1,0};

void init();
void DFS(int x, int y);
int main()
{
    while(cin>>n>>m>>a>>b)
    {
        init();
        DFS(0,0);
        cout<<count<<endl;
    }
    return 0;
}

void init()
{
    count = 0;
    memset(map,0,sizeof(map));
    map[a][b] = 2;
    if(a+1<=n && b-2>=0)    //P7
        map[a+1][b-2] = 2;
    if(a+1<=n && b+2<=m)    //P2
        map[a+1][b+2] = 2;
    if(a+2<=n && b-1>=0)    //P8
        map[a+2][b-1] = 2;
    if(a+2<=n && b+1<=m)    //P1
        map[a+2][b+1] = 2;
    if(a-1>=0 && b-2>=0)    //P6
        map[a-1][b-2] = 2;
    if(a-1>=0 && b+2<=m)    //P3
        map[a-1][b+2] = 2;
    if(a-2>=0 && b-1>=0)    //P5
        map[a-2][b-1] = 2;
    if(a-2>=0 && b+1<=m)    //P4
        map[a-2][b+1] = 2;
}

void DFS(int x, int y)
{
    for(int j=0; j<=1; j++)
    {
        if(x+go[j][0]<=n && y+go[j][1]<=m && map[x+go[j][0]][y+go[j][1]]!=2)
        {
            x+=go[j][0];
            y+=go[j][1];
            if(x==n && y==m)    count++;
            else DFS(x,y);
            x-=go[j][0];
            y-=go[j][1];
        }
    }
}

遞推

#include<iostream>
#include<cstring>
using namespace std;

long long map[25][25];
int n,m,a,b,i,j;

void init();
int main()
{
    while(cin>>n>>m>>a>>b)
    {
        init();
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
            {
                if(map[i][j]==-1)
                    continue;
                if(map[i][j-1]!=-1)
                    map[i][j]+=map[i][j-1];
                if(map[i-1][j]!=-1)
                    map[i][j]+=map[i-1][j];
            }
        cout<<map[n][m]<<endl;
    }
    return 0;
}
void init()
{
    int flag = 0;
    memset(map,0,sizeof(map));
    map[a][b] = -1;
    if(a+1<=n && b-2>=0)    //P7
        map[a+1][b-2] = -1;
    if(a+1<=n && b+2<=m)    //P2
        map[a+1][b+2] = -1;
    if(a+2<=n && b-1>=0)    //P8
        map[a+2][b-1] = -1;
    if(a+2<=n && b+1<=m)    //P1
        map[a+2][b+1] = -1;
    if(a-1>=0 && b-2>=0)    //P6
        map[a-1][b-2] = -1;
    if(a-1>=0 && b+2<=m)    //P3
        map[a-1][b+2] = -1;
    if(a-2>=0 && b-1>=0)    //P5
        map[a-2][b-1] = -1;
    if(a-2>=0 && b+1<=m)    //P4
        map[a-2][b+1] = -1;
    
    for(j=1;j<=m;j++)   //第一行
    {
        if(map[0][j]==-1)
            flag = 1;
        if(flag!=1)
            map[0][j]=1;
    }
    flag=0;
    for(i=1;i<=n;i++)   //第一列
    {
        if(map[i][0]==-1)
            flag = 1;
        if(flag!=1)
            map[i][0]=1;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章