蛇的爬行,蛇出洞
来源:互联网 发布:java投票管理系统 编辑:程序博客网 时间:2024/04/30 04:23
这道bfs,嗯,长见识了。关键是如何判重。。做这道题时刚学bfs,弱的不知道从何下手。。看了两天还怀疑是不是对的。。。
[cpp] view plaincopyprint?
- #include<cstdio>
- #include<queue>
- #include<cstring>
- #include<cstdlib>
- using namespace std;
- const int maxn =21;
- int n,m,l,find,ans,move;
- bool map[maxn][maxn];
- int dx[]={1,-1,0,0};
- int dy[]={0,0,1,-1};
- bool vis[maxn][maxn][1<<14];
- bool check(int x,int y){ return x>=1&&x<=n&&y>=1&&y<=m; }
- struct node{
- int head[2],tail[2];
- bool map[maxn][maxn];
- int step,val;
- }s_pos;
- void bfs(){
- memset(vis,false,sizeof(vis));
- queue<node > q; q.push(s_pos);
- vis[s_pos.head[0]][s_pos.head[1]][ s_pos.val] =true;
- while(!q.empty()){
- node now = q.front(); q.pop();
- if(now.head[0]==1&&now.head[1]==1){
- find=1; ans=now.step;
- return ;
- }
- for(int i=0;i<4;i++){
- node next = now; next.step+=1;
- int x=now.head[0]+dx[i]; int y=now.head[1]+dy[i];
- if(check(x,y)){
- if(next.map[x][y]) continue;
- next.head[0]=x; next.head[1]=y;
- next.map[x][y]=true;
- next.map[now.tail[0]][now.tail[1]]=false;
- int t= next.val&3;
- next.tail[0]=now.tail[0]+dx[t];
- next.tail[1]=now.tail[1]+dy[t];
- next.val=next.val>>2;
- int sum=i<<move;
- next.val+=sum;
- if(!vis[x][y][next.val]){ //这道题是以整个蛇身为基准,“走过”是指完全一样的蛇身在这里出现过
- vis[x][y][next.val]=true; //map上的障碍物只有 此刻的 蛇身和石头
- q.push(next); //也就是说,map上的点为true也不一定没走过
- }
- }
- }
- }
- }
- int main(){
- int t,x,y,ca=1;
- int nx[10],ny[10];
- while(scanf("%d%d%d",&n,&m,&l)!=EOF,(n+m+l)){
- memset(s_pos.map,false,sizeof(s_pos.map));
- memset(map,false,sizeof(map));
- s_pos.val=0; move=((l<<1)-4);
- for(int i=0;i<l;i++) {
- scanf("%d%d",&x,&y);
- nx[i]=x;ny[i]=y;
- s_pos.map[x][y]=true;
- if(i>0){
- for(int j=0;j<4;j++){
- if(x+dx[j]==nx[i-1]&&y+dy[j]==ny[i-1]){
- s_pos.val=(s_pos.val<<2)+j;
- break;
- }
- }
- }
- }
- s_pos.head[0]=nx[0], s_pos.head[1]=ny[0];
- s_pos.tail[0]=nx[l-1];s_pos.tail[1]=ny[l-1];
- scanf("%d",&t); s_pos.step=0;
- for(int i=0;i<t;i++){
- scanf("%d%d",&x,&y);
- map[x][y]=true;
- s_pos.map[x][y]=true;
- }
- find=0; bfs();
- printf("Case %d: ",ca++);
- if(find){
- printf("%d\n",ans);
- }
- else printf("-1\n");
- }
- return 0;
- 蛇的爬行,蛇出洞
- poj 1324 bfs(一条蛇要出洞)
- 慕课网——JS实现贪吃蛇游戏——01(蛇出洞喽~)
- java的爬行器
- 努力爬行的蜗牛
- nyoj971爬行的蚂蚁
- 山顶洞人出洞
- 浅谈百度蜘蛛的爬行
- 爬行与索引的区别
- NYOJ 971 爬行的蚂蚁
- 971 爬行的蚂蚁【水题...】
- 搜索引擎的爬行原理及流程
- ecshop 蜘蛛爬行记录的实现
- nutch全网爬行的底层命令
- nutch全网爬行的底层命令
- 如何利用蜘蛛爬行的网站
- Python 爬行Twitter用户的Friendship图
- 随想录(豆瓣网站的爬行)
- OGNL访问集合类数据
- C#用DataTable实现Group by数据统计
- 正则表达式规则(三)
- hdu 4310 (水)
- js函数split(),用空格作为分隔符时,使用正则表达式,会存在浏览器兼容问题
- 蛇的爬行,蛇出洞
- ubuntu下配置jdk+eclipse+android sdk
- Javascript你意想不到的功能!!!
- Android 内存监测工具 DDMS Heap
- ViewGroup dispatchTouchEvent,onTouchEvent与onInterceptTouchEvent 调用过程
- Qt安装之后出现qmake命令无法找到
- 经典java编程30题
- 【细嚼慢咽大数据】第一章——数据挖掘基本概念,邦弗朗尼原理,IF.IDF指标,哈希函数
- 正则表达式规则(四)