思路:广搜, 因为空格加上动物最多只有32个那么对这32个进行编号,就能可以用一个数字来表示状态了,因为只有 ‘P’   'S' 'M' '.' 那么就可以用4进制刚好可以用64位表示。

接下去每次就是模拟了。

注意:  ‘S’ 不是只有一个。

一个东西如果不是'P'在动的话要先判断周围有没有‘P’,有的话要先吃掉

        'P'在动的时候如果一个位置周围有多个东西,都要吃掉。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<time.h>
#include<string>
#define REP(i,n) for(int i=0;i<n;++i)
#define REP1(i,a,b) for(int i=a;i<=b;++i)
#define REP2(i,a,b) for(int i=a;i>=b;--i)
#define MP make_pair
#define LL long long
#define ULL unsigned long long
#define X first
#define Y second
#define MAXN 1000050
using namespace std;
map<ULL, int> mp;
int dx[] = { , , , - };
int dy[] = { , -, , };
char s[][];
int id[][];
int qx[];
int qy[];
int qcnt;
ULL q[MAXN];
ULL bas[];
struct node {
char a[][];
int scnt;
node() {
}
;
node(ULL now) {
scnt = ;
REP(i,)
REP(j,)
a[i][j] = s[i][j];
REP(i,qcnt)
{
ULL k = now & ;
now >>= ;
if (k == )
continue;
if (k == ) {
a[qx[i]][qy[i]] = 'S';
scnt++;
}
if (k == )
a[qx[i]][qy[i]] = 'M';
if (k == )
a[qx[i]][qy[i]] = 'P';
}
} void debug(){
puts("-------");
REP(i,)
{
REP(j,)putchar(a[i][j]);
puts("");
}
puts("------------------");
}
}; void init() {
qcnt = ;
int cid = ;
memset(id, -, sizeof(id));
REP(i,)
REP(j,)
{
if (s[i][j] == '#' || s[i][j] == 'N')
continue;
qx[qcnt] = i;
qy[qcnt++] = j;
id[i][j] = cid++;
}
} ULL geths(char s[][]) {
ULL ans = ;
REP(i,)
REP(j,)
{
if (s[i][j] == 'S') {
ans += bas[id[i][j] << ];
continue;
}
if (s[i][j] == 'M') {
ans += * bas[id[i][j] << ];
continue;
}
if (s[i][j] == 'P') {
ans += * bas[id[i][j] << ];
}
}
return ans;
} bool check(int x, int y) {
if (x < || x >= || y < || y >= )
return false;
return true;
} node move(node a, int x, int y, int dxx, int dyy, int &p) {
char c = a.a[x][y];
while (true) {
int xx = x + dxx;
int yy = y + dyy;
if ((!check(xx, yy)) || a.a[xx][yy] != '.') {
p = ;
return a;
}
a.a[xx][yy] = a.a[x][y];
a.a[x][y] = '.';
if (c == 'P') {
int flag=;
for (int j = ; j < ; ++j) {
int px = xx + dx[j];
int py = yy + dy[j];
if (!check(px, py))
continue;
if (a.a[px][py] == 'N') {
p = ;
return a;
}
if (a.a[px][py] == 'S' || a.a[px][py] == 'M') {
if (a.a[px][py] == 'S') {
a.scnt--;
if (a.scnt == ) {
p = ;
return a;
}
}
a.a[px][py] = '.';
flag=;
}
}
if(flag)
{
p=;
return a;
}
} else {
for (int i = ; i < ; ++i) {
int px = xx + dx[i];
int py = yy + dy[i];
if (!check(px, py))
continue;
if (a.a[px][py] == 'P') {
if (c == 'S') {
a.scnt--;
if (a.scnt == ) {
p = ;
return a;
}
}
a.a[xx][yy] = '.';
p = ;
return a;
}
} for (int i = ; i < ; ++i) {
int px = xx + dx[i];
int py = yy + dy[i];
if (!check(px, py))
continue;
if (a.a[px][py] == 'N') {
if (c == 'S') {
p = ;
return a;
}
p = ;
return a;
}
}
}
x = xx;
y = yy;
}
return a;
}
int d[MAXN];
int bfs(ULL st) {
int tail = ;
d[] = ;
q[tail++] = st;
mp.clear();
mp[st] = ;
for (int i = ; i < tail; ++i) {
node a = node(q[i]);
REP(j,)
REP(k,)
{
if (a.a[j][k] == 'S' || a.a[j][k] == 'M' || a.a[j][k] == 'P') {
for (int x = ; x < ; ++x) {
int p;
node e = move(a, j, k, dx[x], dy[x], p);
if (p == ) {
return d[i] + ;
}
if (p == ) {
ULL hs = geths(e.a); if (mp.find(hs) == mp.end()) {
mp[hs] = ;
q[tail] = hs;
d[tail++] = d[i] + ;
}
}
}
}
}
}
printf("tail:%d\n",tail);
return -;
} int main() {
// freopen("1.txt","w",stdout);
bas[] = ;
for (int i = ; i <= ; ++i)
bas[i] = bas[i - ] * ;
while(scanf(" %s",s[])!=EOF){
for(int i=;i<;++i)scanf(" %s",s[i]);
init();
ULL hs=geths(s);
REP(i,)REP(j,)if(s[i][j]=='S'||s[i][j]=='M'||s[i][j]=='P')s[i][j]='.';
int ans=bfs(hs);
printf("%d\n",ans);
}
return ;
}

HDU 5010 Get the Nut(2014 ACM/ICPC Asia Regional Xi'an Online)的更多相关文章

  1. hdu 5016 点分治(2014 ACM/ICPC Asia Regional Xi'an Online)

    Mart Master II Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  2. 2014 ACM/ICPC Asia Regional Xi'an Online(HDU 5007 ~ HDU 5017)

    题目链接 A题:(字符串查找,水题) 题意 :输入字符串,如果字符串中包含“ Apple”, “iPhone”, “iPod”, “iPad” 就输出 “MAI MAI MAI!”,如果出现 “Son ...

  3. 2014 ACM/ICPC Asia Regional Xi'an Online

    03 hdu5009 状态转移方程很好想,dp[i] = min(dp[j]+o[j~i]^2,dp[i]) ,o[j~i]表示从j到i颜色的种数. 普通的O(n*n)是会超时的,可以想到o[]最大为 ...

  4. 2014 ACM/ICPC Asia Regional Xi'an Online Paint Pearls

    传说的SB DP: 题目 Problem Description Lee has a string of n pearls. In the beginning, all the pearls have ...

  5. HDU 5000 2014 ACM/ICPC Asia Regional Anshan Online DP

    Clone Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/65536K (Java/Other) Total Submiss ...

  6. HDU 4291 A Short problem(2012 ACM/ICPC Asia Regional Chengdu Online)

    HDU 4291 A Short problem(2012 ACM/ICPC Asia Regional Chengdu Online) 题目链接http://acm.hdu.edu.cn/showp ...

  7. HDU 5029 Relief grain(离线+线段树+启发式合并)(2014 ACM/ICPC Asia Regional Guangzhou Online)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5029 Problem Description The soil is cracking up beca ...

  8. HDU 5002 Tree(动态树LCT)(2014 ACM/ICPC Asia Regional Anshan Online)

    Problem Description You are given a tree with N nodes which are numbered by integers 1..N. Each node ...

  9. HDU 5000 Clone(离散数学+DP)(2014 ACM/ICPC Asia Regional Anshan Online)

    Problem Description After eating food from Chernobyl, DRD got a super power: he could clone himself ...

随机推荐

  1. 对teacher表进行增加,删除,修改

    <%@page import="java.text.SimpleDateFormat"%> <%@ page language="java" ...

  2. IOS苹果和百度地图的相关使用

    iOS中使用较多的3款地图,google地图.百度地图.苹果自带地图(高德).其中苹果自带地图在中国使用的是高德的数据.苹果在iOS 6之后放弃了使用谷歌地图,而改用自家的地图.在国内使用的较多的就是 ...

  3. 获取div或者元素相对于屏幕坐上角的绝对位置

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 关于String str =new String("abc")和 String str = "abc"的比较

    String是一个非常常用的类,应该深入的去了解String 如: String str =new String("abc") String str1 = "abc&qu ...

  5. C语言之实现函数返回一个数组,以及选择排序,还有折半查找。这是同学的一个作业。。。

    作业的具体要求如下: 编写一个完整的程序,实现如下功能.(1)    输入10个无序的整数.(2)    用选择排序法将以上接收的10个无序整数按从大到小的顺序排序.(3)    要求任意输入一个整数 ...

  6. JAVA 冒泡算法

    每种语言都有冒泡JAVA实现如下: public static void main(String args[]){ System.out.println("Start"); int ...

  7. 微信https请求工具类

    工作中用到的微信https请求工具类. package com.gxgrh.wechat.tools; import com.gxgrh.wechat.wechatapi.service.System ...

  8. hdu 4920 Matrix multiplication bitset优化常数

    Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/ ...

  9. 这是一个比较全的Android UI 组件

     Android组件及UI框架大全 原文地址:http://blog.csdn.net/smallnest/article/details/38658593 Android 是目前最流行的移动操作系统 ...

  10. Bootstrap之Carousel不能自动播放的解决办法(转)

    Bootstrap是一个非常好的css/javaScript框架,尤其对于移动端的自适应和适配能力都比较强. 用Bootstrap自带的Carousel写了一个图片轮播的广告部分,用js调用后却出现了 ...