题意:给你一条蛇,要求一以最少的步数走到1,1

思路:

最开始一直没想到应该怎样保存状态,后来发现别人用二进制保存蛇的状态,即每两个节点之间的方向和头节点,二进制最多14位(感觉状态保存都能扯到二进制)。然后就是bfs

问题:

1.最开始完全没想到状态压缩的问题

2.感觉现在做题太急,做题没有足够的思考,思路不清晰便开始写,导致在过程中经常崩盘。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <algorithm>
typedef long long ll;
using namespace std;
int flag;
const int maxn = 25;
const int ma = (1<<14)+10;
int vis[maxn][maxn];
int sta[maxn][maxn][ma];
struct node
{
// int snake[15][2];
int x,y;
int step;
int state;
};
node cur;
int t,n,m;
int dir[4][2] = {{-1,0},{0,-1},{1,0},{0,1}};
int matri[20][2];
int get_state() //蛇的状态
{
int dir;
int stat = 0;
for(int i = t; i > 1; i --)
{
int x = matri[i][0]-matri[i-1][0];
int y = matri[i][1]-matri[i-1][1];
if(x == -1 && y == 0)
dir = 0;
if(x == 0 && y == -1)
dir = 1;
if(x == 1 && y == 0)
dir =2 ;
if(x == 0 && y == 1)
dir = 3;
stat <<= 2;
stat = stat |dir;
}
return stat;
} bool judge(int x,int y,int x1,int y1,int state) //是否吃自己
{
int s;
for(int i = 1; i < t; i++)
{
s = 3;
s = state & s; //取最后两位
state = state >> 2;
if(x == x1+dir[s][0] && y == y1+dir[s][1])
return true;
x1 = x1 + dir[s][0];
y1 = y1 + dir[s][1];
}
return false ;
} int get_next(int i,int state) //去掉高位,输入低位
{
int x = 0-dir[i][0];
int y = 0-dir[i][1];
int dir; int k = (1 << ((t - 1) << 1)) - 1;
if(x == -1 && y == 0)
dir = 0;
if(x == 0 && y == -1)
dir = 1;
if(x == 1 && y == 0)
dir =2 ;
if(x == 0 && y == 1)
dir = 3;
state <<= 2;
state |= dir;
state = state & k; //去掉最高位
return state;
} void bfs()
{
queue<node>q;
cur.step = 0;
sta[cur.x][cur.y][cur.state] = 1;
q.push(cur);
node fo;
while(!q.empty())
{
fo = q.front();
q.pop(); for(int i = 0; i < 4; i++)
{
int x = fo.x+dir[i][0];
int y = fo.y+dir[i][1];
int ts = get_next(i,fo.state);
if(x < 1 || x > n || y <1 || y > m || vis[x][y] || judge(x,y,fo.x,fo.y,fo.state) || sta[x][y][ts])
continue;
if(x == 1 && y == 1)
{
printf("%d\n",fo.step+1);
flag = 1;
return;
}
node tmp;
tmp.x =x ;
tmp.y = y;
tmp.step = fo.step + 1;
// for(int i = t; i >= 1; i--)
// {
// tmp.snake[i][0] = tt.snake[i-1][0];
// tmp.snake[i][1] = tt.snake[i-1][1];
// }
tmp.state = ts;
sta[x][y][tmp.state] = 1;
q.push(tmp);
}
}
} int main()
{
int cas= 1;
while(scanf("%d%d%d",&n,&m,&t) != EOF)
{
memset(vis,0,sizeof(vis));
memset(sta,0,sizeof(sta));
if(n == 0 && m == 0 && t == 0)
break;
for(int i = 1; i <= t; i++)
scanf("%d%d",&matri[i][0],&matri[i][1]); int a,b,k;
scanf("%d",&k);
for(int i = 0; i < k; i++)
{
scanf("%d%d",&a,&b);
vis[a][b] = 1;
}
cur.x = matri[1][0];
cur.y = matri[1][1];
cur.state = get_state();
flag = 0;
printf("Case %d: ",cas++);
if(cur.x == 1 && cur.y == 1)
{
printf("0\n");
continue;
}
bfs();
if(!flag)
printf("-1\n");
}
}

  

最新文章

  1. Microsoft Dynamics CRM 解决数据大于5000时,页面上只能导出5000+数据。
  2. 源码网站(msdn.itellyou.cn) good
  3. GoogleNet tips
  4. OpenJudge 2985数字组合 解析报告/DP
  5. mysql autocommit=OFF导致wordpress 建立数据库连接时出错
  6. Ubuntu下的杀毒
  7. android 开发 drawerlayout出现退不回去的情况
  8. Java比较器对数组,集合排序一
  9. Html5-Canvas实现简易的抽奖转盘
  10. Web数据采集
  11. 20个很有用的CSS技巧
  12. java基础之集合篇
  13. poj-1503-java大数相加
  14. java基础(三):谈谈java异常的处理
  15. Spring MVC @RequestMapping注解详解
  16. Mac上配置maven+eclipse+spark开发环境
  17. How to Pronounce the Days of the Week
  18. 快速掌握Ajax-Ajax基础实例(Ajax返回Json在Java中的实现)
  19. GDI+用PNG图片做半透明异型窗口
  20. Linux下Google Test (GTest)测试环境搭建步骤

热门文章

  1. docopt——好用的Python命令行参数解释器
  2. Flask 页面缓存逻辑,jinja2 过滤器,测试器
  3. OptaPlanner - 把example运行起来(运行并浅析Cloud balancing)
  4. MySQL-压缩版-windows安装
  5. Junit 4 测试中使用定时任务操作
  6. Node入门教程(7)第五章:node 模块化(下) npm与yarn详解
  7. Mongodb中 Documents文档说明
  8. .Net Core MongoDB 简单操作。
  9. php实现单,双向链表,环形链表解决约瑟夫问题
  10. Web系统Login拦截器