open,opened,close与closed的区别和用法

open,opened,close与closed的区别和用法,第1张

open作动词用,表示“开,打开”的意思,强调动作;还可以作形容词用,表示“开着的”,强调状态,常用作be openopened 是open的过去式close作动词用,表示“关,关闭”的意思,强调动作closed可以作形容词用,表示“关着的

closed/open/close是一组反义词,和一个变形词。

1、closed:意思是“近的,接近的”,通常指空间距离极小,甚至几乎相接或者时间重合。用作定语时,用于社会关系上指直系亲属、至爱亲朋之间的紧密联系,即“亲密的,密切的”。另外, 还可指“彻底的,仔细的”“闷热的,不通风的”“势均力敌的”“秘密的,隐藏的”等。

2、open:open的基本意思是“开着的,开放的”,也可作“坦率的,无偏见的”解。作“空旷的,开阔的”解时,在句中只充当定语。作“开始营业的,(职位等)空缺的”解时,在句中作表语。

3、close:close的基本意思是“关”,指把处于打开状态的东西关闭起来,表示缓慢渐近的动作,也表示由此产生的结果。其宾语可以是门窗等,也可以是公路、铁路或其他交通渠道等,还可指公共设施或服务行业对外不营业。

同根词组:open chain

1、读音:英 [ˈəʊpən tʃeɪn]   美 [ˈoʊpən tʃeɪn] 

2、释义:开链。

3、语法:chain的基本意思是“链子,链条”,是可数名词,由其环环相扣的形状而引申为“一系列,一连串”“连锁店”,由其“锁链”的作用而引申可表示“束缚”。

4、用法例句:Heisenberg XX open chain is very important in the study of quantum state transition

5、白话译文:Heisenberg开链对研究量子态在自旋链上的传递有重要的意义。

代码实现(Java)
1 输入
(1) 代表地图二值二维数组(0表示可通路,1表示路障)
int[][] maps = {
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0 },
{ 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }
};123456789123456789
(2) 按照二维数组的特点,坐标原点在左上角,所以y是高,x是宽,y向下递增,x向右递增,我们将x和y封装成一个类,好传参,重写equals方法比较坐标(x,y)是不是同一个。
public class Coord
{
public int x;
public int y;
public Coord(int x, int y)
{
thisx = x;
thisy = y;
}
@Override
public boolean equals(Object obj)
{
if (obj == null) return false;
if (obj instanceof Coord)
{
Coord c = (Coord) obj;
return x == cx && y == cy;
}
return false;
}
}12345678910111213141516171819202122231234567891011121314151617181920212223
(3) 封装路径结点类,字段包括:坐标、G值、F值、父结点,实现Comparable接口,方便优先队列排序。
public class Node implements Comparable
{
public Coord coord; // 坐标
public Node parent; // 父结点
public int G; // G:是个准确的值,是起点到当前结点的代价
public int H; // H:是个估值,当前结点到目的结点的估计代价
public Node(int x, int y)
{
thiscoord = new Coord(x, y);
}
public Node(Coord coord, Node parent, int g, int h)
{
thiscoord = coord;
thisparent = parent;
G = g;
H = h;
}
@Override
public int compareTo(Node o)
{
if (o == null) return -1;
if (G + H > oG + oH)
return 1;
else if (G + H < oG + oH) return -1;
return 0;
}
}1234567891011121314151617181920212223242526272829303112345678910111213141516171819202122232425262728293031
(4) 最后一个数据结构是A星算法输入的所有数据,封装在一起,传参方便。:grin:
public class MapInfo
{
public int[][] maps; // 二维数组的地图
public int width; // 地图的宽
public int hight; // 地图的高
public Node start; // 起始结点
public Node end; // 最终结点
public MapInfo(int[][] maps, int width, int hight, Node start, Node end)
{
thismaps = maps;
thiswidth = width;
thishight = hight;
thisstart = start;
thisend = end;
}
}12345678910111213141516171234567891011121314151617
2 处理
(1) 在算法里需要定义几个常量来确定:二维数组中哪个值表示障碍物、二维数组中绘制路径的代表值、计算G值需要的横纵移动代价和斜移动代价。
public final static int BAR = 1; // 障碍值
public final static int PATH = 2; // 路径
public final static int DIRECT_VALUE = 10; // 横竖移动代价
public final static int OBLIQUE_VALUE = 14; // 斜移动代价12341234
(2) 定义两个辅助表:Open表和Close表。Open表的使用是需要取最小值,在这里我们使用Java工具包中的优先队列PriorityQueue,Close只是用来保存结点,没其他特殊用途,就用ArrayList。
Queue openList = new PriorityQueue(); // 优先队列(升序)
List closeList = new ArrayList();1212
(3) 定义几个布尔判断方法:最终结点的判断、结点能否加入open表的判断、结点是否在Close表中的判断。
/
判断结点是否是最终结点
/
private boolean isEndNode(Coord end,Coord coord)
{
return coord != null && endequals(coord);
}
/
判断结点能否放入Open列表
/
private boolean canAddNodeToOpen(MapInfo mapInfo,int x, int y)
{
// 是否在地图中
if (x 0 || x >= mapInfowidth || y 0 || y >= mapInfohight) return false;
// 判断是否是不可通过的结点
if (mapInfomaps[y][x] == BAR) return false;
// 判断结点是否存在close表
if (isCoordInClose(x, y)) return false;
return true;
}
/
判断坐标是否在close表中
/
private boolean isCoordInClose(Coord coord)
{
return coord!=null&&isCoordInClose(coordx, coordy);
}
/
判断坐标是否在close表中
/
private boolean isCoordInClose(int x, int y)
{
if (closeListisEmpty()) return false;
for (Node node : closeList)
{
if (nodecoordx == x && nodecoordy == y)
{
return true;
}
}
return false;
}1234567891011121314151617181920212223242526272829303132333435363738394041424344454612345678910111213141516171819202122232425262728293031323334353637383940414243444546
(4) 计算H值,“曼哈顿” 法,坐标分别取差值相加
private int calcH(Coord end,Coord coord)
{
return Mathabs(endx - coordx) + Mathabs(endy - coordy);
}12341234
(5) 从Open列表中查找结点
private Node findNodeInOpen(Coord coord)
{
if (coord == null || openListisEmpty()) return null;
for (Node node : openList)
{
if (nodecoordequals(coord))
{
return node;
}
}
return null;
}123456789101112123456789101112
(6) 添加邻结点到Open表
/
添加所有邻结点到open表
/
private void addNeighborNodeInOpen(MapInfo mapInfo,Node current)
{
int x = currentcoordx;
int y = currentcoordy;
// 左
addNeighborNodeInOpen(mapInfo,current, x - 1, y, DIRECT_VALUE);
// 上
addNeighborNodeInOpen(mapInfo,current, x, y - 1, DIRECT_VALUE);
// 右
addNeighborNodeInOpen(mapInfo,current, x + 1, y, DIRECT_VALUE);
// 下
addNeighborNodeInOpen(mapInfo,current, x, y + 1, DIRECT_VALUE);
// 左上
addNeighborNodeInOpen(mapInfo,current, x - 1, y - 1, OBLIQUE_VALUE);
// 右上
addNeighborNodeInOpen(mapInfo,current, x + 1, y - 1, OBLIQUE_VALUE);
// 右下
addNeighborNodeInOpen(mapInfo,current, x + 1, y + 1, OBLIQUE_VALUE);
// 左下
addNeighborNodeInOpen(mapInfo,current, x - 1, y + 1, OBLIQUE_VALUE);
}
/
添加一个邻结点到open表
/
private void addNeighborNodeInOpen(MapInfo mapInfo,Node current, int x, int y, int value)
{
if (canAddNodeToOpen(mapInfo,x, y))
{
Node end=mapInfoend;
Coord coord = new Coord(x, y);
int G = currentG + value; // 计算邻结点的G值
Node child = findNodeInOpen(coord);
if (child == null)
{
int H=calcH(endcoord,coord); // 计算H值
if(isEndNode(endcoord,coord))
{
child=end;
childparent=current;
childG=G;
childH=H;
}
else
{
child = new Node(coord, current, G, H);
}
openListadd(child);
}
else if (childG > G)
{
childG = G;
childparent = current;
// 重新调整堆
openListadd(child);
}
}
}1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606112345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
(7) 回溯法绘制路径
private void drawPath(int[][] maps, Node end)
{
if(end==null||maps==null) return;
Systemoutprintln("总代价:" + endG);
while (end != null)
{
Coord c = endcoord;
maps[cy][cx] = PATH;
end = endparent;
}
}12345678910111234567891011
(8) 开始算法,循环移动结点寻找路径,设定循环结束条件,Open表为空或者最终结点在Close表
public void start(MapInfo mapInfo)
{
if(mapInfo==null) return;
// clean
openListclear();
closeListclear();
// 开始搜索
openListadd(mapInfostart);
moveNodes(mapInfo);
}
/
移动当前结点
/
private void moveNodes(MapInfo mapInfo)
{
while (!openListisEmpty())
{
if (isCoordInClose(mapInfoendcoord))
{
drawPath(mapInfomaps, mapInfoend);
break;
}
Node current = openListpoll();
closeListadd(current);
addNeighborNodeInOpen(mapInfo,current);
}
}
单元和区域和数值,,,中的最大

对,be open 和be closed是表状态,开着,关着,这样一种静止的状态。
close
vt 关, 结束, 使靠拢
vt If you close your eyes, you can't see anything 如果你闭上眼睛,就什么也看不见了。
He closed his speech with a funny joke 他用一则有趣的笑话结束了演讲。
Management closed ranks and ostracized the troublemaker 管理员使队伍靠拢,将捣乱者清除出去
vi 关, 停业, 同意, 短兵相接
The theatre has had to close for lack of support 这家剧院光顾者寡只好关闭。
The firm has decided to close down its branch here这家商行已决定让这里的支店停业。
He grudgingly agreed to have a drink in a hotel close by 他勉强同意在附近的一家客栈里喝点酒。
We grappled with the enemy at close range 我们和敌人短兵相接。
adj 亲近的, 近的, 几乎的, 闷热的, 严密的, 势均力敌的
I believe you and he were very close friends 我相信你和他是亲密无间的朋友。
The church is close to the school 教堂在学校附近。
There is nothing for it but to keep her under close watch 没有任何别的办法,只好把她置于严密的监视之下。
It was a close game and Russia beats China by a narrow margin 这是一场比分接近的比赛,俄罗斯队以微弱的优势击败了中国队。
adv 接近, 靠近, 紧紧地
They live quite close 他们住得很近
His house is close to the factory 他家靠近该厂。
closely
adv 紧密地, 接近地, 严密地, 亲近地
They are closely interconnected他们彼此紧密地联系着。
opened
v 开启(公开, 开证)
adj 开的
The door opened inward into the room 门是朝房间里面开的。
I have an account with that newly opened Bank 我跟那家新开的银行有金钱上的往来。

你是在用A算法做八数码问题么。

比如你要在open表中删除一个节点,然后放到close表中,你可以反过来做,

先找到这个结点,在close表中插入,然后再在open表中删除

我把我写的windows下的代码贴过来你看看,顺便说一句,open表和close表都要经常做删除节点的 *** 作,所以用vector(线性表)其实性能不好,我用的List。


被关上了。The door is closed 门被那个男孩打开了 The door is opened by the boy
这两个词,不用人而用物做主语,可以采用主动语态,但意义有区别。如The shop closes at 10:00 pm 商店晚上十点关门。 这是一种自然状态的描述,没有被动的含义,而且句子里动词表示的意味也不大了。
另外,要注意的是,这两个词的变化形式closed和open是形容词,可以采用主系表结构也表示的是一种状态。如The shop is closed商店还没开门呢 The window is open 窗户开着。
具体细微差别还是要你自己领会了。有什么不清楚的再找我吧

1、设置Open列表以及Close列表,Open列表代表可能要走的状态,Close表表示已经走过的状态。
2、先把A星寻路初始状态节点(寻路源头、初始状态),放入open表中。
3、检查open表,把 f(x) 最小的状态X找出来,将之移出open表,移进close表( f(x) = g(x) + h(x) g(x)初始状态到当前状态的移动累积代价,而h(x)则是从当前状态移动到目标状态的预测代价。)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12715954.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-27
下一篇 2023-05-27

发表评论

登录后才能评论

评论列表(0条)

保存