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. gitea (git服务器), 修改配置,更换IP地址

    使用的gitea项目管理git 服务器 (可以不用备份项目, 通过直接修改gitea配置, 直接使用) 步骤1 可以直接访问项目, 步骤2 ,如果已有项目IP地址固定为192.168.1.x, 新的I ...

  2. 《SpringBoot揭秘 快速构建微服务体系》读后感(二)

    最简单的springBoot应用 package com.louis.test; import org.springframework.boot.SpringApplication; import o ...

  3. 微信小程序开发之tab导航栏

    实现功能: 点击不同的tab导航,筛选数据 UI:   js: data:{ navbar: ['半月维保', '季度维保', '半年维保',"年度维保"],    //count ...

  4. jquery动态创建标签

    $("<div />")[0] 其中 $("<div/>")  相当于 $("<div></div>& ...

  5. vc++图像显示

    显示资源中的图片 (1)从资源中装入位图 ● 定义位图对象数据成员CBitmap m_Bitmap; ● 调用CBitmap成员函数LoadBitmap(),如m_Bitmap.LoadBitmap( ...

  6. 脚本执行JavaScript代码

    下面是一个具体的demo测试脚本引擎,执行javas文件. package Rhino; import java.io.FileReader;import java.net.URL; import j ...

  7. 洛谷P3847 [TJOI2007]调整队形

    P3847 [TJOI2007]调整队形 题目背景 学校艺术节上,规定合唱队要参加比赛,各个队员的衣服颜色不能很混乱:合唱队员应排成一横排,且衣服颜色必须是左右对称的. 例如:“红蓝绿蓝红”或“红蓝绿 ...

  8. 约数和问题 (codevs2606 && 洛谷2424)

    P2424 约数和 题目背景 Smart最近沉迷于对约数的研究中. 题目描述 对于一个数X,函数f(X)表示X所有约数的和.例如:f(6)=1+2+3+6=12.对于一个X,Smart可以很快的算出f ...

  9. 洛谷P3959 宝藏(状压dp)

    传送门 为什么感觉状压dp都好玄学……FlashHu大佬太强啦…… 设$f_{i,j}$表示当前选的点集为$i$,下一次要加入的点集为$j$时,新加入的点和原有的点之间的最小边权.具体的转移可以枚举$ ...

  10. base64编码后的pdf文件前端页面展示--pdf.js的应用

    最近在整理项目中用到的插件或者使用心得,感觉还是写成博客,能加深新一层的理解. 我先说一下我的需求:由于java后台编译的文件流在手机端加载速度太慢,所以想着可以在前端解析,放在页面展示给用户. 所以 ...