首页 > 代码库 > 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)