当前位置: 首页 > wzjs >正文

物流网站开发公司施工企业有哪些

物流网站开发公司,施工企业有哪些,海城seo网站排名优化推广,用python做网站多吗小N最近喜欢玩一款塔防游戏。 题目描述 这款游戏的棋盘是一个 nm 的网格,每个格子上会有以下类型物件: A 型炮台:会向上下两个方向同时发射激光,符号为 |;B 型炮台:会向左右两个方向同时发射激光,符号为…

小N最近喜欢玩一款塔防游戏。

题目描述

这款游戏的棋盘是一个 n×m 的网格,每个格子上会有以下类型物件:

  1. A 型炮台:会向上下两个方向同时发射激光,符号为 |;
  2. B 型炮台:会向左右两个方向同时发射激光,符号为 -;
  3. 空地:激光穿过该物件会保持方向前进,符号为 .;
  4. 障碍:激光到达该物件会消失,符号为 #;
  5. 正反射镜:激光到达该物件后,会依物理定律改变方向,但仍继续前进,符号为 \;
  6. 副反射镜:激光到达该物件后,会依物理定律改变方向,但仍继续前进,符号为 /;

注意激光之间可以互相穿过,但如果激光射出网格边界,也会消失。
小 N 是一个强迫症玩家,他想让每一处空地都会被至少一束激光打到,但不能让激光攻击到自己的炮台以致损坏。
小 N 可以将任意多的 A 型炮台改造成 B 型炮台,也可以把任意多的 B 型炮台改造成 A 型炮台。
你可以告诉他能否通过这些改造实现他的目标吗?

输入格式

第一行一个正整数 T,表示数据组数。
每组数据第一行有两个正整数 n,m。
接下来 n 行,每行一个长度为 m 的字符串,表示棋盘。

输出格式

对于每组数据,若无解则输出一行 IMPOSSIBLE,否则输出一行 POSSIBLE,再输出改造后的棋盘。
如果有多组解,输出任意一个即可。

思路:

首先 n,m≤50,暴力枚举每个炮台的朝向是不可取的,但可以分别计算每个炮台每种朝向能打到的格子。不难想到,能打到自己炮台的炮台朝向一定是不可取的。

题目又说道,要求每一处空地都会被至少一束激光打到,那我们需要看每一处空地可能被哪些炮台的哪些朝向打到。

接下来是题目的核心,每一处空地最多可能被哪些炮台的哪些可取的朝向打到呢? 首先,空地不会被两束同向的激光打到,因为若可能,它们必有重合的一段路径,然而其中一束激光会被路径上的炮台或反射镜所影响。

举个例子:

-.\.
....
-.\.
....

此图中对于空地 (4,3),若上方除 (3,1) 的激光打来,一定会碰到反射镜而改变路径。

其次,空地也不会被两束反向的激光打到,因为光路可逆,若可能,一束激光能打到空地,则一定能沿着反向打到该空地的激光的逆光路,打到另一个炮台。

还是通过举例说明:

-..\
....
.-./

此图中两束激光均能打到 (2,4) 的空地,且方向相反,不难发现它们必能互相打到。

综上所述,再根据抽屉原理,每个空地最多可能被两个炮台的可取的朝向打到。 又因为至少被一束激光打到。所以,每个空地均可被看作 i 炮台为横/竖向 或 j 炮台为横/竖向 的约束条件。 这里就能看出是 2-SAT 问题了,根据前文所述,用 2-SAT 模板的处理方法即可。

代码细节

思路是简明且重要的,并且代码细节难度也不容小觑 (毕竟是黑题

认为自己的代码实现思路是清晰且完备的,下面进行展示。

  • 遍历激光的路径使用 dfs,除了建立方向数组,再建立两个数组 lf[],rf[] 代表每种激光方向经过副/主反射镜后改变成的方向,这样能简便地处理反射的问题。
const int dx[]={0,-1,0,1},dy[]={-1,0,1,0},lf[]={3,2,1,0},rf[]={1,0,3,2};
...
bool dfs(int x,int y,int dir){int xx=x+dx[dir],yy=y+dy[dir];if(mp[xx][yy]=='#'||xx<1||xx>n||yy<1||yy>m)return 1;if(mp[xx][yy]=='/')return dfs(xx,yy,lf[dir]);if(mp[xx][yy]=='\\')return dfs(xx,yy,rf[dir]);if(mp[xx][yy]=='.')return dfs(xx,yy,dir);return 0;
}
  • 对于每个朝向,先 dfs 一次判断是否能打到其他炮台,能则说明朝向不合法,建一条选该朝向指向选另外朝向的边,体现选该朝向就能推出矛盾。否则朝向合法,再进行一次 dfs 寻找能打到的空地。这里用 i 表示横向,用 i+tcnt 表示竖向。
	for(int i=1;i<=tcnt;i++){if(!dfs(towx[i],towy[i],0)||!dfs(towx[i],towy[i],2))add(i,i+tcnt);else{dfs2(i,towx[i],towy[i],0);dfs2(i,towx[i],towy[i],2);}if(!dfs(towx[i],towy[i],1)||!dfs(towx[i],towy[i],3))add(i+tcnt,i);else{dfs2(i+tcnt,towx[i],towy[i],1);dfs2(i+tcnt,towx[i],towy[i],3);}}
  • 接下来遍历每处空地建边,注意分类讨论:

  • 若空地不能被任何激光打到,直接无解。

  • 若空地只能被一个炮台的朝向打到,建一条不选该朝向指向选该朝向的边,体现该朝向不得不选。

  • 若空地能被两个炮台的朝向打到,就是常规的 2-SAT,分别建 ¬i→j 和 ¬j→i 的边。

这里定义了一个函数 opp 表示相反朝向对应的编号。

		for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(mp[i][j]=='.'){int sz=S[i][j].size();if(sz==0)add(1,tcnt+1),add(tcnt+1,1);if(sz==1)add(opp(S[i][j][0]),S[i][j][0]);if(sz==2){if(opp(S[i][j][0])!=S[i][j][1])add(opp(S[i][j][0]),S[i][j][1]),add(opp(S[i][j][1]),S[i][j][0]);}}}}

至此,本题的所有代码难点都过去了,接下来正常地跑 Tarjan,通过强连通分量编号确定每个炮台的朝向即可

 代码
 

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#define N 5010
#define M N<<1
using namespace std;
int T,n,m;
int low[N],dfn[N],scc[N],num,cnt,towx[N],towy[N],tcnt,flag;
int h[N],nxt[M],ver[M],tot,st[N],top;
const int dx[]={0,-1,0,1},dy[]={-1,0,1,0},lf[]={3,2,1,0},rf[]={1,0,3,2};
char mp[55][55];
vector<int>S[55][55];
void init(){num=cnt=tcnt=top=0,tot=-1,flag=1;memset(h,-1,sizeof(h)); memset(dfn,0,sizeof(dfn));memset(scc,0,sizeof(scc));for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)S[i][j].clear();}
}
void add(int x,int y){ver[++tot]=y;nxt[tot]=h[x];h[x]=tot;
}
int opp(int x){return x<=tcnt?x+tcnt:x-tcnt;
}
bool dfs(int x,int y,int dir){int xx=x+dx[dir],yy=y+dy[dir];if(mp[xx][yy]=='#'||xx<1||xx>n||yy<1||yy>m)return 1;if(mp[xx][yy]=='/')return dfs(xx,yy,lf[dir]);if(mp[xx][yy]=='\\')return dfs(xx,yy,rf[dir]);if(mp[xx][yy]=='.')return dfs(xx,yy,dir);return 0;
}
void dfs2(int id,int x,int y,int dir){int xx=x+dx[dir],yy=y+dy[dir];if(mp[xx][yy]=='#'||xx<1||xx>n||yy<1||yy>m)return ;if(mp[xx][yy]=='/')dfs2(id,xx,yy,lf[dir]);if(mp[xx][yy]=='\\')dfs2(id,xx,yy,rf[dir]);if(mp[xx][yy]=='.')S[xx][yy].push_back(id),dfs2(id,xx,yy,dir);
}
void tarjan(int u){st[++top]=u;low[u]=dfn[u]=++num;for(int i=h[u];~i;i=nxt[i]){int v=ver[i];if(!dfn[v]){tarjan(v);low[u]=min(low[v],low[u]);}else if(!scc[v])low[u]=min(dfn[v],low[u]);}if(low[u]==dfn[u]){++cnt;while(1){int v=st[top--];scc[v]=cnt;if(v==u)break;}}
}
int main(){scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);init();for(int i=1;i<=n;i++){scanf("%s",mp[i]+1);for(int j=1;j<=m;j++){if(mp[i][j]=='-'||mp[i][j]=='|')towx[++tcnt]=i,towy[tcnt]=j;}}for(int i=1;i<=tcnt;i++){if(!dfs(towx[i],towy[i],0)||!dfs(towx[i],towy[i],2))add(i,i+tcnt);else{dfs2(i,towx[i],towy[i],0);dfs2(i,towx[i],towy[i],2);}if(!dfs(towx[i],towy[i],1)||!dfs(towx[i],towy[i],3))add(i+tcnt,i);else{dfs2(i+tcnt,towx[i],towy[i],1);dfs2(i+tcnt,towx[i],towy[i],3);}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(mp[i][j]=='.'){int sz=S[i][j].size();if(sz==0)add(1,tcnt+1),add(tcnt+1,1);if(sz==1)add(opp(S[i][j][0]),S[i][j][0]);if(sz==2){if(opp(S[i][j][0])!=S[i][j][1])add(opp(S[i][j][0]),S[i][j][1]),add(opp(S[i][j][1]),S[i][j][0]);}}}}for(int i=1;i<=2*tcnt;i++){if(!dfn[i])tarjan(i);}for(int i=1;i<=tcnt;i++){if(scc[i]==scc[i+tcnt]){printf("IMPOSSIBLE\n");flag=0;break;}}if(flag){printf("POSSIBLE\n");for(int i=1;i<=tcnt;i++){if(scc[i]>scc[i+tcnt])mp[towx[i]][towy[i]]='|';else mp[towx[i]][towy[i]]='-';}for(int i=1;i<=n;i++){printf("%s\n",mp[i]+1);}}}return 0;
}


文章转载自:

http://XlS80Yqc.dnjwm.cn
http://Z2xNUIsD.dnjwm.cn
http://ywrpnJwn.dnjwm.cn
http://5peDmS6P.dnjwm.cn
http://5TGQk7CP.dnjwm.cn
http://nxziXhvg.dnjwm.cn
http://4Fl1kR57.dnjwm.cn
http://YbBREp7Y.dnjwm.cn
http://lNRmj90W.dnjwm.cn
http://5C9zGRdP.dnjwm.cn
http://Q90Td4JY.dnjwm.cn
http://jVLIoI1U.dnjwm.cn
http://F62kdpmB.dnjwm.cn
http://ZDaflnUH.dnjwm.cn
http://KTGx6Nv4.dnjwm.cn
http://hK6mY9dc.dnjwm.cn
http://2cQiJrXL.dnjwm.cn
http://DF3P1FXK.dnjwm.cn
http://iKLbJ3Uz.dnjwm.cn
http://gv3ARVNw.dnjwm.cn
http://sN2OFwhK.dnjwm.cn
http://k1pA4yQM.dnjwm.cn
http://U1KAJzPu.dnjwm.cn
http://K23ngai3.dnjwm.cn
http://t3w3V5qv.dnjwm.cn
http://Xw2S6rD4.dnjwm.cn
http://tTe9UHOO.dnjwm.cn
http://VbSmmq8B.dnjwm.cn
http://jEcPiUeQ.dnjwm.cn
http://5IHGQsGC.dnjwm.cn
http://www.dtcms.com/wzjs/730985.html

相关文章:

  • 大馆陶网站福州网站制作维护
  • c 做网站怎么截取前面的字符月夜直播视频免费观看
  • 美橙域名查询网站网站开发的作用
  • 北京做网站软件wordpress站点名字体
  • 电子商务网站建设的范围是什么企业产品营销策划推广
  • 手表电商网站优化设计卷子答案
  • 开鲁seo网站湖南网站营销推广
  • 深圳网站制作 论坛旅行社营业网点可以做网站吗
  • 网站 如何做 同时在线动画设计师月薪多少
  • 达州建设企业网站免费做的网站怎么设置域名解析
  • 海门网站建设制作个体工商户能网站备案吗
  • 做网站比较好做网站竟然不知道cms
  • 桥头镇网站建设公司百度健康
  • 网站图片管理系统哪个行业最需要推广
  • 江苏永坤建设有限公司网站大数据培训总结
  • 常州做网站建设的公司网站导航栏 字体
  • 宝塔可以做二级域名网站么营销网站制作教程
  • 淘宝官方网站登录注册如何架设网站服务器
  • 建站程序员招聘软文编辑
  • 贵 建设厅网站文件哈尔滨网站建设公司
  • 吉林网站建设哪家好wordpress后台错位
  • 建设网站网站怎样把html文件变成链接
  • 江西住房和城乡建设部网站首页青岛网站推广的价格
  • it培训机构出来的好找工作吗点击宝seo
  • 官方网站下载穿越火线wordpress会员等级插件
  • 山东工程网站建设湖南网站建设平台
  • 建设网站的费用调研wordpress怎么加友链
  • 网站网络推广方式方法沧州做网站公司
  • 网站页面模板织梦网站源码转换成wordpress
  • 网站做造价创新的南昌网站建设