TLE,额 ,有空再写吧。

#include<queue>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
const int dx[]={,,-,-,,,-,-},dy[]={,-,,-,,-,,-};
const int N = ;
struct node{
int x,y;
int step,state;
};
queue<node>q;
int n,sx,sy;
char a[N][N];
int id[N][N],tot;
bool Vis[N][N][];
bool check( int state,int x ,int y)
{
if(Vis[x][y][state])
return ;
//下
for(int i=x+;i<=n;i++)
if(a[i][y]!='.'&& !(state&(<<id[x][y])))
{
if(a[i][y]=='C'||a[i][y]=='Q')
return ;
break;
}
//上
for(int i=x-;i<=;i--)
if(a[i][y]!='.'&& !(state&(<<id[i][y])))
{
if(a[i][y]=='C'||a[i][y]=='Q')
return ;
break;
}
//左
for(int j=y+;j<=n;j++)
if(a[x][j]!='.'&&!(state&(<<id[x][j])))
{
if(a[x][j]=='C'||a[x][j]=='Q')
return ;
break;
}
//右
for(int j=y-;j>=;j--)
if(a[x][j]!='.'&&!(state&(<<id[x][j])))
{
if(a[x][j]=='C'||a[x][j]=='Q')
return ;
break;
}
//左上
for(int i=x-,j=y-;i>=&&j>=;i--,j--)
if(a[i][j]!='.'&&!(state&(<<id[i][j])))
{
if(a[i][j]=='B'||a[i][j]=='Q')
return ;
break;
}
//右上
for(int i=x+,j=y-;i<=n&&j>=;i++,j--)
if(a[i][j]!='.'&&!(state&(<<id[i][j])))
{
if(a[i][j]=='B'||a[i][j]=='Q')
return ;
break;
}
//左下
for(int i=x-,j=y+;i>=&&j<=n;i--,j++)
if(a[i][j]!='.'&&!(state&(<<id[i][j])))
{
if(a[i][j]=='B'||a[i][j]=='Q')
return ;
break;
}
//右下
for(int i=x+,j=y+;i<=n&&j<=n;i++,j++)
if(a[i][j]!='.'&&!(state&(<<id[i][j])))
{
if(a[i][j]=='B'||a[i][j]=='Q')
return ;
break;
}
int X,Y;
for(int i=;i<=;i++)
{
X=x+dx[i];Y=y+dy[i];
if(X>=&&X<=n&&Y>=&&Y<=n&&a[X][Y]=='K')
return ;
}
if(x!=&&((y!=n&&a[x-][y+]=='P'&&!(state&(<<(id[x-][y+]))||(y!=&&a[x-][y-]=='P'&&!(state&(<<id[x-][y-])))))))
return ;
for(int i=x-;i<=x+;i++)
for(int j=y-;j<=y+;j++)
if(x>=&&x<=n&&y>=&&y<=n)
{
if(a[i][j]=='X') return ;
}
return ;
}
void work()
{
queue<node>q;tot=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
id[i][j]=-,a[i][j]=;
for(int k=;k<=(<<);k++)
Vis[i][j][k]=;
} for(int i=;i<=n;i++)
{
scanf("%s",a[i]+);
for(int j=;j<=n;j++)
{
if(a[i][j]=='O')
sx=i,sy=j,a[i][j]='.';
else
if(a[i][j]=='C'||a[i][j]=='K'||a[i][j]=='Q'||a[i][j]=='X'||a[i][j]=='P')
id[i][j]=tot++;
else a[i][j]='.';
}
}
if(!check(,sx,sy))
{
cout<<-;
return;
}
q.push((node){sx,sy,,});
node now;int x,y,state;
while(!q.empty())
{
now=q.front();q.pop();
state=now.state;
for(int i=;i<;i++)
{
x=now.x+dx[i];y=now.y+dy[i];
if(x<||x>n||y<||y>n) continue;
if(a[x][y]=='X')
{
printf("%d\n",now.step+);
return;
}
if(a[x][y]!='.')
state|= <<id[x][y];
if(check(state,x,y))
Vis[x][y][state]=,q.push((node){x,y,now.step+,state});
}
}
cout<<-;
}
int main()
{
while(scanf("%d",&n))
work();
return ;
}

P3930 SAC E#1 - 一道大水题 Knight的更多相关文章

  1. 【Luogu】P3930 SAC E#1 - 一道大水题 Knight

    [题目]洛谷10月月赛R1 提高组 [题意]给定n*n棋盘和<=16个棋子,给几个棋子种类和攻击范围,现我方只有一马,求能否吃王. [算法]状压+BFS [题解]16种棋子中,马不能吃马,直接处 ...

  2. [洛谷3930]SAC E#1 - 一道大水题 Knight

    Description 他们经常在一起玩一个游戏,不,不是星际争霸,是国际象棋.毒奶色觉得F91是一只鸡.他在一个n×n的棋盘上用黑色的城堡(车).骑士(马).主教(象).皇后(副).国王(帅).士兵 ...

  3. 第三届山西省赛1004 一道大水题(scanf)

    一道大水题 时间限制: C/C++ 2000ms; Java 4000ms 内存限制: 65535KB 通过次数: 44 总提交次数: 1020 问题描述 Dr. Pan作为上兰帝国ACM的总负责人, ...

  4. 【数据结构】 最小生成树(四)——利用kruskal算法搞定例题×3+变形+一道大水题

    在这一专辑(最小生成树)中的上一期讲到了prim算法,但是prim算法比较难懂,为了避免看不懂,就先用kruskal算法写题吧,下面将会将三道例题,加一道变形,以及一道大水题,水到不用高级数据结构,建 ...

  5. 2013年山东省第四届ACM大学生程序设计竞赛-最后一道大水题:Contest Print Server

    点击打开链接 2226: Contest Print Server Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 53  Solved: 18 [Su ...

  6. SAC E#1 - 一道神题 Sequence1

    题目背景 小强和阿米巴是好朋友. 题目描述 小强很喜欢数列.有一天,他心血来潮,写下了一个数列. 阿米巴也很喜欢数列.但是他只喜欢其中一种:波动数列. 一个长度为n的波动数列满足对于任何i(1 < ...

  7. SAC E#1 - 一道中档题 Factorial

    题目背景 SOL君(炉石主播)和SOL菌(完美信息教室讲师)是好朋友. 题目描述 SOL君很喜欢阶乘.而SOL菌很喜欢研究进制. 这一天,SOL君跟SOL菌炫技,随口算出了n的阶乘. SOL菌表示不服 ...

  8. 【洛谷十月月测】 P3927 SAC E#1 - 一道中档题 Factorial

    题目传送门:https://www.luogu.org/problemnew/show/P3927 题目大意:给你两个正整数n,k,求n!在k进制下末尾零的数量. 我们通过简单的数学分析,便可以发现, ...

  9. P3928 SAC E#1 - 一道简单题 Sequence2

    题目背景 小强和阿米巴是好朋友. 题目描述 小强喜欢数列.有一天,他心血来潮,写下了三个长度均为n的数列. 阿米巴也很喜欢数列.但是他只喜欢其中一种,波动数列. 阿米巴把他的喜好告诉了小强.小强便打算 ...

随机推荐

  1. Linux下安装GB2312的示例

    Linux下安装GB2312的示例 Step 1: 到Linux字符集的安装包目录下  [cd /usr/share/i18n/charmaps] Step 2: 解压该目录下的GB2312.gz   ...

  2. 集训Day13

    我这个肥宅一点都不快乐嘤嘤嘤 bzoj3456 求n个点的无向简单连通图的个数 我们可以用容斥推出递推式 首先我们令为 于是有 这样就是可以用CDQ分治解决的一类递推式了 不是那么明显的变形一下得到 ...

  3. ubuntu_deb安装命令

    dpkg命令常用格式如下: sudo dpkg -I iptux.deb#查看iptux.deb软件包的详细信息,包括软件名称.版本以及大小等(其中-I等价于--info) sudo dpkg -c ...

  4. MATLAB 内存容量修改 zz

    MATLAB 内存容量修改 - Oliver的日志 - 网易博客 在用MATLAB做图像处理时 经常会碰到内存溢出的情况,可用如下方法修改,使得MATLAB的内存容量最大: 出自matlab:matl ...

  5. 面试题: 数据库 oracle数据库 已看1 意义不大 有用

    Oracle数据库面试题总结 2017年04月27日 22:41:44 阅读数:9271 1.SQL语句分类 DQL(数据查询语言)select DML(数据操作语言)insert.delete.up ...

  6. linux 下消息队列发送后没有信息

    在使用消息队列时,调用 #include <stdio.h> #include <stdlib.h> #include <string.h> #include &l ...

  7. C# 中的迭代器 yield关键字 提高性能和可读性

    展示一个例子 IList<string> FindBobs(IEnumerable<string> names) { var bobs = new List<string ...

  8. PHP判断用户是手机端?还是浏览器端访问?

    function isMobile(){ $useragent=isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ' ...

  9. Infoapth 使用拼写 并加载web part 在Infopath的页面上

    <g_vml_:shape style="POSITION: absolute; WIDTH: 568px; HEIGHT: 1312px; TOP: 0px; LEFT: 0px&q ...

  10. FZU - 2218 Simple String Problem(状压dp)

    Simple String Problem Recently, you have found your interest in string theory. Here is an interestin ...