• 【wikioi】1010 过河卒


    题目链接

    算法:DFS+剪枝

    14.01.02 PS: 递推应该也可以的,改天看看

    刚开始最容易想到的是朴素搜索

    #include <iostream>
    using namespace std;
    int n, m, X, Y;
    int ans = 0;
    void dfs(int i, int j)
    {
    	if(i == 0 && j == 0){ans++; return;}
    	if(i<0||j<0||(i==X&&j==Y)            ||
    	  (i==X-2&&(j==Y-2||j==Y-1||j==Y+1)) ||
    	  (i==X+1&&(j==Y-2||j==Y+1||j==Y+2)) || 
    	  (i==X-1&&(j==Y-2||j==Y+2))         ||
    	  (i==X+2&&(j==Y-1||j==Y+1))         )
    	  return;
    	dfs(i,j-1); dfs(i-1,j);
    }
    int main()
    {
    	cin >> n >> m >> X >> Y;
    	dfs(n, m);
    	cout << ans << endl;
    	return 0;
     }

    虽然能AC,但是数据一大就TLE了。

    然后想到的是剪枝

    //简单的搜索
    #include <iostream>
    using namespace std;
    const int N = 15, M = 15;
    int n, m, X, Y;
    int f[N+2][M+2] = {0};
    void dfs(int i, int j)
    {
    	//一系列复杂的判断= =
    	if((i==X&&j==Y)				||
    	   (i==X-2&&(j==Y-2||j==Y-1||j==Y+1))	||
    	   (i==X+1&&(j==Y-2||j==Y+1||j==Y+2))	||
    	   (i==X-1&&(j==Y-2||j==Y+2))		||
    	   (i==X+2&&(j==Y-1||j==Y+1))		)
    		return;
    	if(j-1>0 && !f[i][j-1]) dfs(i,j-1);
    	if(i-1>0 && !f[i-1][j]) dfs(i-1,j);
    	f[i][j] = f[i][j-1] + f[i-1][j]; //路径数等于上面的加上左边的(这是逆向的dfs)
    }
    int main()
    {
    	f[1][1] = 1;
    	cin >> n >> m >> X >> Y;
    	X++; //将下标归为以1开始
    	Y++; //将下标归为以1开始
    	dfs(n+1, m+1);
    	cout << f[n+1][m+1] << endl;
    	return 0;
    }

    AC

  • 相关阅读:
    oracle 导入数据语句
    移动上去换样式代码
    google suggest 代码例子
    删除一个表的字段的sql语句命令
    将json从前台传到后台注意问题
    eclipse 自动 getter setter 注释
    jsp界面获取地址栏参数
    常见的正则表达式验证
    JSTL 核心标签库
    javascript中的call和apply两个方法的区别
  • 原文地址:https://www.cnblogs.com/iwtwiioi/p/3521811.html
Copyright © 2020-2023  润新知