或许到了这个时候发这种基础题 有点蠢 但是 我还真被自己蠢到了
想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
#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;
}
}