贪吃蛇

题目:

http://oj.changjun.com.cn/problem/detail/pid/2185

Description

身长为L的贪吃蛇在一个有障碍的N*M的格子中游走,问最少用多少步才能让贪吃蛇的蛇头到达(1,1)。

Input

第一行三个正整数 N, M,L。L表示贪吃蛇的长度。
接下来 L 行,顺序描述贪吃蛇每节身体的位置。每行两个正整数 X,Y。 表示某节身体的位置,按蛇头到蛇尾的顺序描述。
接下来一个正整数K。 表示有 K个障碍,每个障碍占一个格子。
接下来K行, 每行两个正整数 X,Y, 表示某个障碍的位置。

Output

一个整数,表示到达格子(1,1)最少的步数。(给定数据保证能够到达,并且蛇头移动的目标格子必须是空的。)

Sample Input

5 6 4
4 1
4 2
3 2
3 1
3
2 3
3 3
3 4

Sample Output

9

Hint

对于 100% 的数据,2≤N、M≤20,2≤L≤8

解析:

可以广搜,但状态懒得存,干脆写个迭代加深搜索,代码简洁好写。

可是迭代深搜复杂度还是比较高的,我们考虑IDA*。

先预处理出每个点到终点的距离,记为dis[x][y]。

记当前层数为now,迭代层数为deep。

当dis[x][y]+now>deep时,则return;因为怎么都不可能在deep-now步之内走到终点。

 1 #include<set>
 2 #include<map>
 3 #include<queue>
 4 #include<stack>
 5 #include<ctime>
 6 #include<cmath>
 7 #include<string>
 8 #include<vector>
 9 #include<cstdio>
10 #include<cstdlib>
11 #include<cstring>
12 #include<iostream>
13 #include<algorithm>
14 using namespace std;
15 int n,m;
16 int q1[1000],q2[1000],head=1,tail=0;
17 int mp[25][25],fb[25][25],w[5]={0,1,-1,0,0},u[5]={0,0,0,1,-1};
18 int vis[25][25],dis[25][25];
19 int ww[5]={0,0,0,1,-1},uu[5]={0,1,-1,0,0};
20 void DFS(int deep,int now)
21 {
22   int xx=q1[tail],yy=q2[tail];
23   if(now+dis[xx][yy]>deep) return;//IDA*
24   if(now==deep){
25     if(xx==1 && yy==1) printf("%d",deep),exit(0);
26     else return;
27   }
28   for(int i=1;i<=4;i++)
29     {
30       int x=xx+w[i],y=yy+u[i];
31       if(x>0 && x<=n && y>0 && y<=m && !mp[x][y]){
32     mp[x][y]=1;
33     q1[++tail]=x,q2[tail]=y;
34     int kx=q1[head],ky=q2[head];
35     mp[kx][ky]=0;head++;
36     DFS(deep,now+1);
37     mp[kx][ky]=1;
38     mp[x][y]=0;
39     head--;tail--;
40       }
41     }
42 }
43 void BFS()
44 {
45   queue<int>q1,q2;
46   q1.push(1),q2.push(1);
47   vis[1][1]=1;
48   while(!q1.empty()){
49     int xx=q1.front(),yy=q2.front();
50     q1.pop();q2.pop();
51     for(int i=1;i<=4;i++)
52       {
53     int x=xx+ww[i],y=yy+uu[i];
54     if(x>0 && x<=n && y>0 && y<=n && !fb[x][y] && !vis[x][y])
55       dis[x][y]=dis[xx][yy]+1,q1.push(x),q2.push(y),vis[x][y]=1;
56       }
57   }
58 }
59 int main()
60 {
61   freopen("snake.in","r",stdin);
62   freopen("snake.out","w",stdout);
63   int L,x,y,k;
64   scanf("%d%d%d",&n,&m,&L);
65   for(int i=1;i<=L;i++){
66     scanf("%d%d",&x,&y);
67     q1[L-i+1]=x;q2[L-i+1]=y;
68     mp[x][y]=1;
69   }
70   scanf("%d",&k);
71   for(int i=1;i<=k;i++)
72     scanf("%d%d",&x,&y),mp[x][y]=1,fb[x][y]=1;
73   BFS();
74   for(int i=0;i<=n;i++)
75     for(int j=0;j<=m;j++)
76       fb[i][j]=mp[i][j];
77   for(int i=0;;i++)
78     {
79       head=1;tail=L;
80       DFS(i,0);
81       for(int j=0;j<=n;j++)
82     for(int ij=0;ij<=m;ij++)
83       mp[j][ij]=fb[j][ij];
84     }
85 }
原文地址:https://www.cnblogs.com/pantakill/p/6535907.html