题意:贪吃蛇的题目
思路:BFS+状态的记录,坑了无数发,
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int MAXN = 500000; bool flag[8],vis[25][25],mp[21][21][16384]; int n,m,l; int xx[4]={-1,0,1,0}; // up,right,dow,left int yy[4]={0,1,0,-1}; int front,rear; struct Node { int x,y; int step; int s[8]; int p[8][2]; }; Node q[MAXN]; int _pre(int sx,int sy,int _x,int _y) { int x=_x-sx,y=_y-sy; if (x==-1) return 0; else if (x==1) return 2; else if (y==-1) return 1; return 3; } int adss(Node G) { int va=G.s[0],vb=1,i; for (i = 1; i < l-1; i++) { va = va*4+G.s[i]; } return va; } int itself(int x, int y, Node G) { for (int i = 0; i < l-1; i++) { if (x == G.p[i][0] && y == G.p[i][1]) return 1; } return 0; } int bfs() { while (front!=rear) { Node gg; front = (front+1) % MAXN; gg = q[front]; int vx = adss(q[front]); if (mp[gg.x][gg.y][vx]) continue; mp[gg.x][gg.y][vx] = 1; if (q[front].x==0&&q[front].y==0) return q[front].step; for (int i = 0; i < 4; i++) { int x,y; x = q[front].x+xx[i], y = q[front].y+yy[i]; if (x<0 || y<0 || x>=n || y>=m || vis[x][y]) continue; if (itself(x,y,q[front])) continue; rear = (rear+1) % MAXN; q[rear].x = x, q[rear].y = y, q[rear].step = q[front].step+1; for (int j = 0;j < l-2; j++) { q[rear].s[j+1] = q[front].s[j]; q[rear].p[j+1][0] = q[front].p[j][0]; q[rear].p[j+1][1] = q[front].p[j][1]; } q[rear].p[0][0] = q[front].x, q[rear].p[0][1] = q[front].y; q[rear].s[0] = _pre(x,y,q[front].x,q[front].y); } } return -1; } int main() { int ci=1; while (scanf("%d%d%d", &n, &m, &l) == 3 && n) { memset(vis,0,sizeof(vis)); memset(flag,0,sizeof(flag)); memset(mp,0,sizeof(mp)); int x, y; scanf("%d%d",&x, &y); x--, y--;//头 front = -1, rear = 0;//队列头和尾 q[0].x = x, q[0].y = y, q[0].step = 0; int sx = x, sy = y; for (int i = 0;i < l-1; i++) { scanf("%d%d", &x, &y); x--,y--; q[0].s[i] = _pre(sx,sy,x,y); q[0].p[i][0] = x, q[0].p[i][1] = y;//蛇身 sx = x, sy = y; } int k; scanf("%d",&k); while (k--) { scanf("%d%d", &x, &y); x--,y--; vis[x][y] = 1; } cout << "Case "<< ci++ <<": "; int cnt = bfs(); printf("%d\n", cnt); } return 0; }