<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>“sokoban.ws 的博客” 的评论</title>
	<atom:link href="http://sokoban.ws/blog/index.php?feed=comments-rss2" rel="self" type="application/rss+xml" />
	<link>http://sokoban.ws/blog</link>
	<description></description>
	<lastBuildDate>Thu, 26 May 2016 05:12:31 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
	<item>
		<title>[坑]POI补完计划#1 &#124; qiancl 关于 推箱子游戏的一个箱子推动路径搜索算法 （二） 的评论</title>
		<link>http://sokoban.ws/blog/?p=843#comment-1971</link>
		<dc:creator>[坑]POI补完计划#1 &#124; qiancl</dc:creator>
		<pubDate>Thu, 26 May 2016 05:12:31 +0000</pubDate>
		<guid isPermaLink="false">http://sokoban.ws/blog/?p=843#comment-1971</guid>
		<description>[...] $《推箱子游戏的一个箱子推动路径搜索算法（二）》$  2574    #include&lt;cstring&gt; #include&lt;cstdio&gt; #include&lt;vector&gt; #include&lt;algorithm&gt; using namespace std; #define N 110 const int dx[]={1,-1,0,0},dy[]={0,0,1,-1}; char mp[N][N];int i,j,l,r,top,ans,Po[N][N],Now,stx,ex,now,ey,bx,by,sty,k,m,n,x,y,po[N][N],bcc,clock,pre[N][N]; bool cut[N][N],mk[N][N][4];vector&lt;int&gt;bl[N][N]; inline void add(int x,int y,int bcc){ for(int i=0;i&lt;bl[x][y].size();++i)if(bl[x][y][i]==bcc)return; bl[x][y].push_back(bcc); } struct edge{int x1,y1,x2,y2;}S[N*N]; struct node{int x,y,d;}q[N*N*4]; int dfs(int x,int y,int fx,int fy){ int lw=pre[x][y]=++clock,cld=0;Po[x][y]=Now; for(int i=0;i&lt;4;++i){ int xx=x+dx[i],yy=y+dy[i]; if(mp[xx][yy]==&#039;S&#039;&#124;&#124;xx&lt;1&#124;&#124;xx&gt;n&#124;&#124;yy&lt;1&#124;&#124;yy&gt;m&#124;&#124;(xx==fx&amp;&amp;yy==fy))continue; edge e=(edge){x,y,xx,yy}; if(!pre[xx][yy]){ S[++top]=e,++cld;int lv=dfs(xx,yy,x,y); lw=min(lw,lv); if(lv&gt;=pre[x][y]){ cut[x][y]=1,++bcc; for(;;){ edge o=S[top--]; add(o.x1,o.y1,bcc),add(o.x2,o.y2,bcc); if(o.x1==x&amp;&amp;o.y1==y&amp;&amp;o.x2==xx&amp;&amp;o.y2==yy)break; } } }else if(pre[xx][yy]&lt;pre[x][y])S[++top]=e,lw=min(lw,pre[xx][yy]); } if(fx&lt;0&amp;&amp;fy&lt;0&amp;&amp;cld==1)cut[x][y]=0; return lw; } void dfs1(int x,int y){ po[x][y]=now;for(int i=0;i&lt;4;++i){ int xx=x+dx[i],yy=y+dy[i]; if(po[xx][yy]&#124;&#124;mp[xx][yy]==&#039;S&#039;&#124;&#124;xx&lt;1&#124;&#124;xx&gt;n&#124;&#124;yy&lt;1&#124;&#124;yy&gt;m&#124;&#124;mp[xx][yy]==&#039;P&#039;)continue; dfs1(xx,yy); } } int main(){ for(scanf(&quot;%d%d&quot;,&amp;n,&amp;m),i=1;i&lt;=n;++i)scanf(&quot;%s&quot;,mp[i]+1); for(i=1;i&lt;=n;++i)for(j=1;j&lt;=m;++j)if(!pre[i][j]&amp;&amp;mp[i][j]!=&#039;S&#039;)++Now,dfs(i,j,-1,-1); for(i=1;i&lt;=n;++i)for(j=1;j&lt;=m;++j)if(!po[i][j]&amp;&amp;mp[i][j]!=&#039;S&#039;&amp;&amp;mp[i][j]!=&#039;P&#039;)++now,dfs1(i,j); for(i=1;i&lt;=n;++i)for(j=1;j&lt;=m;++j) if(mp[i][j]==&#039;M&#039;)stx=i,sty=j; else if(mp[i][j]==&#039;P&#039;)bx=i,by=j; else if(mp[i][j]==&#039;K&#039;)ex=i,ey=j; for(l=1,i=0;i&lt;4;++i)if(po[stx][sty]==po[bx+dx[i]][by+dy[i]])q[++r]=((node){bx,by,i}),mk[bx][by][i]=1; for(;l&lt;=r;++ans){ int k=r-l+1; for(j=1;j&lt;=k;++j){ int x=q[l].x,y=q[l].y,d=q[l++].d,xx,yy; if(x==ex&amp;&amp;y==ey)return printf(&quot;%d&quot;,ans),0; for(i=0;i&lt;4;++i){ if(cut[x][y]){ bool flag=0; for(int p=0;p&lt;bl[x+dx[i]][y+dy[i]].size()&amp;&amp;flag==0;++p) for(int q=0;q&lt;bl[x+dx[d]][y+dy[d]].size()&amp;&amp;flag==0;++q)if(bl[x+dx[i]][y+dy[i]][p]==bl[x+dx[d]][y+dy[d]][q])flag=1; if(flag&amp;&amp;mp[xx=x-dx[i]][yy=y-dy[i]]!=&#039;S&#039;&amp;&amp;xx&gt;=1&amp;&amp;xx&lt;=n&amp;&amp;yy&gt;=1&amp;&amp;yy&lt;=m) if(!mk[xx][yy][i])q[++r]=(node){xx,yy,i},mk[xx][yy][i]=1; }else if((!mk[xx=x-dx[i]][yy=y-dy[i]][i])&amp;&amp;(mp[xx][yy]!=&#039;S&#039;)&amp;&amp;xx&gt;=1&amp;&amp;xx&lt;=n&amp;&amp;yy&gt;=1&amp;&amp;yy&lt;=m&amp;&amp;Po[x+dx[i]][y+dy[i]]==Po[x+dx[d]][y+dy[d]])q[++r]=(node){xx,yy,i},mk[xx][yy][i]=1; } } } puts(&quot;NO&quot;); } [...]</description>
		<content:encoded><![CDATA[<p>[...] $《推箱子游戏的一个箱子推动路径搜索算法（二）》$  2574    #include&lt;cstring&gt; #include&lt;cstdio&gt; #include&lt;vector&gt; #include&lt;algorithm&gt; using namespace std; #define N 110 const int dx[]={1,-1,0,0},dy[]={0,0,1,-1}; char mp[N][N];int i,j,l,r,top,ans,Po[N][N],Now,stx,ex,now,ey,bx,by,sty,k,m,n,x,y,po[N][N],bcc,clock,pre[N][N]; bool cut[N][N],mk[N][N][4];vector&lt;int&gt;bl[N][N]; inline void add(int x,int y,int bcc){ for(int i=0;i&lt;bl[x][y].size();++i)if(bl[x][y][i]==bcc)return; bl[x][y].push_back(bcc); } struct edge{int x1,y1,x2,y2;}S[N*N]; struct node{int x,y,d;}q[N*N*4]; int dfs(int x,int y,int fx,int fy){ int lw=pre[x][y]=++clock,cld=0;Po[x][y]=Now; for(int i=0;i&lt;4;++i){ int xx=x+dx[i],yy=y+dy[i]; if(mp[xx][yy]==&#039;S&#039;||xx&lt;1||xx&gt;n||yy&lt;1||yy&gt;m||(xx==fx&amp;&amp;yy==fy))continue; edge e=(edge){x,y,xx,yy}; if(!pre[xx][yy]){ S[++top]=e,++cld;int lv=dfs(xx,yy,x,y); lw=min(lw,lv); if(lv&gt;=pre[x][y]){ cut[x][y]=1,++bcc; for(;;){ edge o=S[top--]; add(o.x1,o.y1,bcc),add(o.x2,o.y2,bcc); if(o.x1==x&amp;&amp;o.y1==y&amp;&amp;o.x2==xx&amp;&amp;o.y2==yy)break; } } }else if(pre[xx][yy]&lt;pre[x][y])S[++top]=e,lw=min(lw,pre[xx][yy]); } if(fx&lt;0&amp;&amp;fy&lt;0&amp;&amp;cld==1)cut[x][y]=0; return lw; } void dfs1(int x,int y){ po[x][y]=now;for(int i=0;i&lt;4;++i){ int xx=x+dx[i],yy=y+dy[i]; if(po[xx][yy]||mp[xx][yy]==&#039;S&#039;||xx&lt;1||xx&gt;n||yy&lt;1||yy&gt;m||mp[xx][yy]==&#039;P&#039;)continue; dfs1(xx,yy); } } int main(){ for(scanf(&quot;%d%d&quot;,&amp;n,&amp;m),i=1;i&lt;=n;++i)scanf(&quot;%s&quot;,mp[i]+1); for(i=1;i&lt;=n;++i)for(j=1;j&lt;=m;++j)if(!pre[i][j]&amp;&amp;mp[i][j]!=&#039;S&#039;)++Now,dfs(i,j,-1,-1); for(i=1;i&lt;=n;++i)for(j=1;j&lt;=m;++j)if(!po[i][j]&amp;&amp;mp[i][j]!=&#039;S&#039;&amp;&amp;mp[i][j]!=&#039;P&#039;)++now,dfs1(i,j); for(i=1;i&lt;=n;++i)for(j=1;j&lt;=m;++j) if(mp[i][j]==&#039;M&#039;)stx=i,sty=j; else if(mp[i][j]==&#039;P&#039;)bx=i,by=j; else if(mp[i][j]==&#039;K&#039;)ex=i,ey=j; for(l=1,i=0;i&lt;4;++i)if(po[stx][sty]==po[bx+dx[i]][by+dy[i]])q[++r]=((node){bx,by,i}),mk[bx][by][i]=1; for(;l&lt;=r;++ans){ int k=r-l+1; for(j=1;j&lt;=k;++j){ int x=q[l].x,y=q[l].y,d=q[l++].d,xx,yy; if(x==ex&amp;&amp;y==ey)return printf(&quot;%d&quot;,ans),0; for(i=0;i&lt;4;++i){ if(cut[x][y]){ bool flag=0; for(int p=0;p&lt;bl[x+dx[i]][y+dy[i]].size()&amp;&amp;flag==0;++p) for(int q=0;q&lt;bl[x+dx[d]][y+dy[d]].size()&amp;&amp;flag==0;++q)if(bl[x+dx[i]][y+dy[i]][p]==bl[x+dx[d]][y+dy[d]][q])flag=1; if(flag&amp;&amp;mp[xx=x-dx[i]][yy=y-dy[i]]!=&#039;S&#039;&amp;&amp;xx&gt;=1&amp;&amp;xx&lt;=n&amp;&amp;yy&gt;=1&amp;&amp;yy&lt;=m) if(!mk[xx][yy][i])q[++r]=(node){xx,yy,i},mk[xx][yy][i]=1; }else if((!mk[xx=x-dx[i]][yy=y-dy[i]][i])&amp;&amp;(mp[xx][yy]!=&#039;S&#039;)&amp;&amp;xx&gt;=1&amp;&amp;xx&lt;=n&amp;&amp;yy&gt;=1&amp;&amp;yy&lt;=m&amp;&amp;Po[x+dx[i]][y+dy[i]]==Po[x+dx[d]][y+dy[d]])q[++r]=(node){xx,yy,i},mk[xx][yy][i]=1; } } } puts(&quot;NO&quot;); } [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>[坑]POI补完计划#1 &#8211; qiancl 关于 推箱子游戏的一个箱子推动路径搜索算法 的评论</title>
		<link>http://sokoban.ws/blog/?p=298#comment-1970</link>
		<dc:creator>[坑]POI补完计划#1 &#8211; qiancl</dc:creator>
		<pubDate>Thu, 26 May 2016 04:48:21 +0000</pubDate>
		<guid isPermaLink="false">http://sokoban.ws/blog/?p=298#comment-1970</guid>
		<description>[...] $《推箱子游戏的一个箱子推动路径搜索算法》$ [...]</description>
		<content:encoded><![CDATA[<p>[...] $《推箱子游戏的一个箱子推动路径搜索算法》$ [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>HZF 关于 推箱子是PSPACE完全问题 的评论</title>
		<link>http://sokoban.ws/blog/?p=2254#comment-1969</link>
		<dc:creator>HZF</dc:creator>
		<pubDate>Sat, 20 Feb 2016 00:39:00 +0000</pubDate>
		<guid isPermaLink="false">http://sokoban.ws/blog/?p=2254#comment-1969</guid>
		<description>感谢杨兄的分享和精彩的分析。</description>
		<content:encoded><![CDATA[<p>感谢杨兄的分享和精彩的分析。</p>
]]></content:encoded>
	</item>
</channel>
</rss>
