SDUT 1265-马拦过河卒(DFS)

来源:互联网 发布:codeblocks 知乎 编辑:程序博客网 时间:2024/06/09 22:30

马拦过河卒

Time Limit: 3000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。棋盘用坐标表示,A点(0,0)、B点(n,m)(n,m为不超过15的整数),同样马的位置坐标是需要给出的。现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。

输入

一行四个数据,用空格分隔,分别表示B点的坐标和马的坐标。

输出

一个数据,表示所有的路径条数。

示例输入

6 6 3 3

示例输出

6
sad 写了好久。。接近一个小时,一开始居然把马的范围初始化错了。。
首先生成地图,然后挂掉马的范围(8个点) ,然后爆搜就可以了。
#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#include <cctype>#include <cmath>#include <cstdlib>#include <vector>#include <queue>#include <set>#include <map>#include <list>#define ll long longusing namespace std;const int INF = 0x3f3f3f3f;int n,m,ex,ey,ans,ma[20][20];bool vis[20][20];void dfs(int x,int y){if(x==n&&y==m){ans++;return ;}if(x+1<=n&&ma[x+1][y]&&!vis[x+1][y]){vis[x+1][y]=1;dfs(x+1,y);vis[x+1][y]=0;}if(y+1<=m&&ma[x][y+1]&&!vis[x][y+1]){vis[x][y+1]=1;dfs(x,y+1);    vis[x][y+1]=0;}}int main(){memset(vis,0,sizeof(vis));scanf("%d%d%d%d",&n,&m,&ex,&ey);ans=0;for(int i=0;i<=n;i++)for(int j=0;j<=m;j++)ma[i][j]=1;if(ex-1>=0&&ex-1<=n&&ey-2>=0&&ey-2<=m)ma[ex-1][ey-2]=0;if(ex-1>=0&&ex-1<=n&&ey+2>=0&&ey+2<=m)ma[ex-1][ey+2]=0;if(ex+1>=0&&ex+1<=n&&ey-2>=0&&ey-2<=m)ma[ex+1][ey-2]=0;if(ex+1>=0&&ex+1<=n&&ey+2>=0&&ey+2<=m)ma[ex+1][ey+2]=0;if(ex+2>=0&&ex+2<=n&&ey-1>=0&&ey-1<=m)ma[ex+2][ey-1]=0;if(ex+2>=0&&ex+2<=n&&ey+1>=0&&ey+1<=m)ma[ex+2][ey+1]=0;if(ex-2>=0&&ex-2<=n&&ey+1>=0&&ey+1<=m)ma[ex-2][ey+1]=0;if(ex-2>=0&&ex-2<=n&&ey-1>=0&&ey-1<=m)ma[ex-2][ey-1]=0;if(ex>=0&&ex<=n&&ey>=0&&ey<=m)ma[ex][ey]=0;vis[0][0]=1;dfs(0,0);printf("%d\n",ans);return 0;}
2 0