zoukankan      html  css  js  c++  java
  • 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
    ",ans);
    	return 0;
    }

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    【转】Android 6.0 Marsmallow BLE : Connection Parameters
    过滤掉字符串中重复的字符
    从第一个汉字开始分割字符串
    根据年月生成日历函数
    计算两个日期之间的工作日
    根据日期返回星座
    检查给定串是否存在于由区间及点集的结合内
    将整型数字转换为大写汉字
    向左填充指定字符串
    人民币小写金额转大写
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4731689.html
Copyright © 2011-2022 走看看