首页 > 代码库 > SDUT 1265-马拦过河卒(DFS)
SDUT 1265-马拦过河卒(DFS)
马拦过河卒
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 long using 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; }
SDUT 1265-马拦过河卒(DFS)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。