https://vijos.org/p/1791

暴力的话只想到bfs,然后估计是状态超了才得20分。

噗,为啥暴力就不能想得简单点QAQ。。。。。这种思想很好啊。

这一题我看了题解后不得不说我竟然没想到。。

为啥要bfs。。这种找路径的依赖前边状态的不需要bfs啊!

因为bfs是无限拓展的,状态很大,本题又是8种决策,状态达到8^n啊。。。。sad。。

我们可以这样想,因为状态是向前走的,而且当前状态只依赖于前一个状态,那么我们可以用dp思想啊。。直接枚举当前状态然后看是否根据上一状态到达,标记即可。。

我实在太弱QAQ

(虽然这样做还是暴力,我也没能做出正解,但是这种思想值得写这篇blog,orz

#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << (#x) << " = " << (x) << endl
#define printarr2(a, b, c) for1(_, 1, b) { for1(__, 1, c) cout << a[_][__]; cout << endl; }
#define printarr1(a, b) for1(_, 1, b) cout << a[_] << '\t'; cout << endl
inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; } const int N=40, dx[]={-1, -2, -2, -1, 1, 2, 2, 1}, dy[]={-2, -1, 1, 2, 2, 1, -1, -2};
int vis[2][N][N], n, T, X, Y, cnt, a[N][N];
int main() {
read(n); read(T); read(X); read(Y);
for1(i, 1, n) for1(j, 1, n) read(a[i][j]);
CC(vis, -1);
vis[0][X][Y]=0; int flag=0;
for1(t, 1, T) {
for1(i, 1, n) for1(j, 1, n) if(t%a[i][j]==0) {
rep(k, 8) {
int fx=dx[k]+i, fy=dy[k]+j;
if(fx<1 || fy<1 || fx>n || fy>n || vis[flag][fx][fy]!=t-1) continue;
vis[!flag][i][j]=t;
break;
}
}
flag=!flag;
}
for1(i, 1, n) for1(j, 1, n) if(vis[flag][i][j]==T) ++cnt;
printf("%d\n", cnt);
for1(i, 1, n) for1(j, 1, n) if(vis[flag][i][j]==T) printf("%d %d\n", i, j);
return 0;
}

描述

“骑士的旅行”是最近流行的一种棋盘游戏。N*N的棋盘上,我们于时刻0在第X行、 第Y列的格子上放置一个骑士。每个时刻将骑士按照规则进行一步移动,即某个坐标改变2个单位,同时另一个坐标改变1个单位。游戏规则中,棋盘的每个格子并 不总是可以使用的,具体来说,每个格子都被赋予一个正整数,只有当前的时刻是此正整数的倍数时,这个格子才能使用。当然,游戏过程中的每个时刻,骑士必须 处在一个可以使用的格子上。游戏者需要仔细的设计骑士的移动方案才能让游戏进行下去。

给你一个游戏的初始局面,即棋盘的大小,时刻0骑士的位置,以及每个格子被赋予的正整数,请你计算能否对骑士进行T次操作(即游戏能否进行到时刻T)。如果能,请找出时刻T骑士可能出现的所有位置。

格式

输入格式

第1行,包括两个正整数N,T,分别表示棋盘的大小,和操作次数。

第2行,包括两个正整数X, Y,表示时刻0骑士所处的位置。

第3~N+2行,每行N个不超过10^9的正整数。第i+2行的第j个整数表示棋盘上第i行、第j列的格子被赋予的整数。

输出格式

第一行,包含一个非负整数M,表示T次操作后骑士可能出现的位置总数。

接下来M行,每行包括两个正整数,表示一个骑士可能出现的位置。将这些位置按照行编号递增(行编号相同时按列编号递增)的顺序输出。

样例1

样例输入1[复制]

3 2
1 1
1 3 2
2 3 2
3 1 1

样例输出1[复制]

2
1 1
1 3

限制

1s

提示

对于30%的数据,有1 ≤ T ≤ 50,000;
对于100%的数据,有3 ≤ N ≤ 30,1 ≤ T ≤ 1,000,000,1 ≤ X, Y ≤ N。

来源

COCI 2011/2012

【vijos】1791 骑士的旅行(特殊的技巧)的更多相关文章

  1. 一个人的旅行(用小技巧转化为dijkstra算法)

    注意: 1:因为两点之间可能有多条路,所以更新路径长度的时候做一次判断 if(time < mat[a][b]) mat[a][b] = mat[b][a] = time; 2:因为主函数中的数 ...

  2. bzoj4336: BJOI2015 骑士的旅行

    Description 在一片古老的土地上,有一个繁荣的文明. 这片大地几乎被森林覆盖,有N座城坐落其中.巧合的是,这N座城由恰好N-1条双 向道路连接起来,使得任意两座城都是连通的.也就是说,这些城 ...

  3. 刷题总结——骑士的旅行(bzoj4336 树链剖分套权值线段树)

    题目: Description 在一片古老的土地上,有一个繁荣的文明. 这片大地几乎被森林覆盖,有N座城坐落其中.巧合的是,这N座城由恰好N-1条双 向道路连接起来,使得任意两座城都是连通的.也就是说 ...

  4. bzoj4336 骑士的旅行 (树链剖分+multiset)

    首先大概有一个树剖+树套树的做法,但我哪会写啊 然后发现k很小,如果用线段树记每个区间前k大的的话,可以O(k)地合并 而且一个点还有可能有好多个骑士,所以要用multiset维护一下 然后树剖就好啦 ...

  5. [BZOj4336][BJOI2015]骑士的旅行(树链剖分+线段树)

    树链剖分,对每个叶子用multiset记录前K大士兵,其余节点通过从儿子归并维护前K大士兵.过于模板. #include<set> #include<cstdio> #incl ...

  6. 小结:bfs

    概要: 我们在初始状态要到达终止状态可以沿着同深度的向下搜索,这样范围覆盖更广,在解的深度较小的时候十分适用. 技巧及注意: 所有状态在转移后如果要打标记一定要在进队列前打!不要在出队列才打!否则就是 ...

  7. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  8. 翻扣告诉你外出旅游时实用的一些小tips

    很多人出行都会带着大包小包,东西胡乱塞成一团,导致每次要用的时候都翻个遍.所以今天游游君为大家推荐几个出门旅行的小技巧. 收拾行李时,把鞋子放进浴帽里.浴帽很容易洗干净,还可以防止鞋子把干净的衣服弄脏 ...

  9. poj2488 A Knight's Journey

    http://poj.org/problem?id=2488 题目大意:骑士厌倦了一遍又一遍地看到同样的黑白方块,于是决定去旅行. 世界各地.当一个骑士移动时,他走的是“日”字.骑士的世界是他赖以生存 ...

随机推荐

  1. mysql结构相同的三张表查询一条记录\将一张表中的数据插入另外一张表

    将一张表中的数据插入另外一张表 1.两张表结构相同 insert into 表1名称 select * from 表2名称 2.两张结构不相同的表 insert into 表1名称(列名1,列名2,列 ...

  2. Git和Repo管理使用

    Git和Repo管理使用简要介绍 http://blog.csdn.net/stevenhu_223/article/details/8828130 多仓库代码管理器Repo的安装,使用以及服务器搭建 ...

  3. ajax请求接口数据

    var api = 'http://192.168.68.208:666/ajax/api.ashx'; // api += 'action=/api/blackhistory/list&ke ...

  4. Entity Framework底层操作封装V2版本号(1)

    由于同志们一直给我提建议说.曾经发的版本号有问题.所以经过了我这一年多的使用和扩展,如今方法基本稳定了. 如今贴出来给大家使用: 首先上场的是数据库操作层: using System; using S ...

  5. adb shell root

    因为开发需要,我经常会用到adb这个工具(Android Debug Bridge),我们都知道adb shell默认是没有root权限的,修改系统文件就很不方便了,adb push一个文件就提示Pe ...

  6. Python 入门demo第一篇

    #-*- coding: UTF-8 -*- 2.7版本对中文的要求 import uuid import socket def get_mac_address(): mac=uuid.UUID(in ...

  7. Drupal的system_list()函数解析

    system_list()函数的目的是根据传入的资源类型,返回一个数组列表: function system_list($type) { ... ... } 参数$type支持下面三种类型: boot ...

  8. Java教程到处都是,究竟怎样能学好Java?

    学习Java如何入门?学习教程要点是什么?如何精通?做好以下这些点,入门更快,掌握Java更轻松. Java必备基础知识 1.你需要精通面向对象分析与设计(OOA/OOD).涉及模式(GOF,J2EE ...

  9. Windows Visual Studio 下配置OpenGL

    很多同学不是很清楚OpenGL的配置,一个个帮忙配置也不是办法,干脆就写一篇教程好了. 本人使用的是Visual Studio 2015版本,对于Visual Studio 2012版本的配置会稍有不 ...

  10. Hibernate JPA实体继承的映射(二) @MappedSuperclass

    基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中. 1.@MappedSuperclass注解只能标准在类上:@ ...