过河卒

或许到了这个时候发这种基础题 有点蠢 但是 我还真被自己蠢到了
想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点的路径的条数
过河卒_第1张图片
DFS

#include
#include
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
#include
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;
    }
}

你可能感兴趣的:(#,ZSTUOJ)