或許到了這個時候發這種基礎題 有點蠢 但是 我還真被自己蠢到了
想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;
}
}