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. 创建maven多模块项目

    一:创建父项目

  2. 「P4996」「洛谷11月月赛」 咕咕咕(数论

    题目描述 小 F 是一个能鸽善鹉的同学,他经常把事情拖到最后一天才去做,导致他的某些日子总是非常匆忙. 比如,时间回溯到了 2018 年 11 月 3 日.小 F 望着自己的任务清单: 看 iG 夺冠 ...

  3. ACM学习历程——POJ 2376 Cleaning Shifts(贪心)

    Description Farmer John is assigning some of his N (1 <= N <= 25,000) cows to do some cleaning ...

  4. poj1149PIGS——网络最大流

    题目:http://poj.org/problem?id=1149 不把猪圈当做点,而把顾客当作点,把猪当作边权(流量): 因为猪圈中的猪可流动,所以共用一个猪圈的人互相连边: 注意应该连成链的形式, ...

  5. 并查集基础 模板题 hdu1232 畅通工程

    模板题 引入并查集——一则有趣的故事 为了解释并查集的原理,我将举一个更有趣的例子.话说江湖上散落着各式各样的大侠,有上千个之多.他们没有什么正当职业,整天背着剑在外面走来走去,碰到和自己不是一路人的 ...

  6. foreach中collection的三种用法

    转载:http://blog.sina.com.cn/s/blog_b0d90e8c0102v1q1.html 传参参考:http://www.cnblogs.com/ruiati/p/6410339 ...

  7. Robot FrameWork基础学习(四) 元素定位

    元素定位 对于web自动化测试来说,就是操作页面的各种元素,在操作元素之间需要先找到元素,换句话说就是定位元素. Selenium2Library提供了非常丰富的定位器: 虽然提供了这么多种定位方式, ...

  8. 一个.NET通用JSON解析/构建类的实…

    一个.NET通用JSON解析/构建类的实现(c#) 在.NET Framework 3.5中已经提供了一个JSON对象的序列化工具,但是他是强类型的,必须先按JSON对象的格式定义一个类型,并将类型加 ...

  9. ant错误 reference classes not found

    使用ant提示reference classes not found错误 原因是 里面的一些属性的值要用on或者yes或者off或者no..用成其他,例如true,false的话就会有这个提示..

  10. 2-6 Flutter开发环境与Android开发环境设置实操(Windows)

    通常安装完AS后,sdk的目录 C:\Users\wjw\AppData\Local\Android\sdk 如果在这个目录下没有找到sdk的目录的话 Settings里面搜索sdk,找到Androi ...