CloudLunar
主页
知识库
人文社科
自然科学
跨学科领域
热门分类
算法及题库
云璟月's
墨色集(设计)
指尖集(代码)
未央集(随笔)
流觞集(语录)
如花集(书影)
纸鸢集(小说)
登录
B站
微博
人人
开心
Twitter
Facebook
RSS订阅链接
留言板
关于我
在社交网站上关注我
B站
微博
人人
开心
Twitter
Facebook
RSS订阅
RSS订阅链接
留言板
关于我
查看HDU/1010的源代码
←
HDU/1010
因为以下原因,你没有权限编辑本页:
你刚才请求的操作只对属于该用户组的用户开放:
用户
您可以查看并复制此页面的源代码:
[[分类:深度优先搜索]][[分类:广度优先搜索]] ==摘要== {{信息题|Tempter of the Bone|http://acm.hust.edu.cn/vjudge/contest/view.action?cid{{=}}68572#problem/K|2|100|超时|0|time=2015-02-06 14:43:00}} *来自寒假练习:[http://acm.hust.edu.cn/vjudge/contest/view.action?cid=68572 Only a signing tool !] K题 *原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010 ==题意== 在n*m的地图上求从S走到D是否能够恰好t步走完。 ==题解== 显然还是搜索题,裸搜会T,所以要剪枝,加上下面两个剪枝好像就Acceptable了: ===奇偶性剪枝=== 这是不太好想的,我的确用了百度优先搜索<ref>http://blog.csdn.net/cyg0810/article/details/8194108</ref>……限制语句是这样的 <pre>((ex+sx+ey+sy+t)%2)//(ex,ey)为终点,(sx,sy)为起点//</pre> 想到这样一个矩阵就比较好理解,x+y为偶数时 为0 否则为1: 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 由图可知,任意一个点相邻的必然是与本身相反的值,也就是说,要想走到与本身值相同的点必然要走偶数步,同理,要想走到与本身相异的值的点必然要走奇数步; 所以,当两个位置的x+y奇偶性相同时(同为0或同为1)若时间为奇数 则必然无法到达;当两个位置的奇偶性不同时(一个为1,另一个为0)若时间为偶数也必不能到达,可以被剪枝。 ===可行性剪枝=== 代码如下 (abs(sx-ex)+abs(sy-ey)>t)||(n*m-w<t)//w代表墙的个数// 意思是: #如果直接无视障碍走过去的时间都不只t,那么直接剪枝。 #如果去掉墙所有的位置都走一遍的时间还少于t,那么也直接剪枝。 ==代码== {{折叠|1010.cpp代码已折叠 |<pre>#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #define ci const int & using namespace std; const int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1}; bool visited[10][10]={}; char a[10][10]={}; int n,m,t,sx,sy,ex,ey,w=0; const bool dfs(ci x,ci y,ci t) { if(!t&&a[x][y]=='D') return 1; if(!t)return 0; if(visited[x][y]||a[x][y]!='.') return 0; visited[x][y]=1; for(int i=0;i<4;++i) { if(dfs(x+dx[i],y+dy[i],t-1)) { visited[x][y]=0; return 1; } } visited[x][y]=0; return 0; } int main() { while(1) { cin>>n>>m>>t; if(!n) return 0; w=1; for(int i=1;i<=n;++i) { for(int j=1;j<=m;++j) { cin>>a[i][j]; if(a[i][j]=='S') sx=i,sy=j,a[i][j]='.'; if(a[i][j]=='D') ex=i,ey=j; if(a[i][j]=='X') ++w; } } if(((ex+sx+ey+sy+t)&1)||(abs(sx-ex)+abs(sy-ey)>t)||(n*m-w<t))//奇偶性剪枝,可行性剪枝// cout<<"NO\n"; else if(dfs(sx,sy,t)) cout<<"YES\n"; else cout<<"NO\n"; } } </pre> |code1010}} ==参考资料和拓展阅读== <references/>
该页面使用的模板:
模板:=
(
查看源代码
)
模板:信息题
(
查看源代码
)
模板:折叠
(
查看源代码
)
返回
HDU/1010
。
著作权声明
[
编辑
]
除非另有说明,本
网站内容
采用
知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
进行许可(中国大陆可以参照
知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议
,如有不同以前者为准)。
如果需要商业化使用,请另联系作者取得授权。
关于
[
编辑
]
联系
@云璟月Lunar
的新浪微博
本站RSS:
RSS链接