hdu 2216 bfs

题目大意:两个东西朝相同方向移动
Sample Input
4 4
XXXX
.Z..
.XS.
XXXX
4 4
XXXX
.Z..
.X.S
XXXX
4 4
XXXX
.ZX.
.XS.
XXXX
Sample Output
1
1
Bad Luck!

由于两个棋子必然有一个移动。所以假设其中一个一直移动即可,比较水了

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 using namespace std;
 8 int n,m,t;
 9 int d1[4][2]={1,0,0,1,-1,0,0,-1};
10 int d2[4][2]={-1,0,0,-1,1,0,0,1};
11 char s[25][25];
12 int vis[25][25][25][25];
13 struct node
14 {
15     int x1,y1,s,x2,y2;
16     node(){}
17     node(int xx,int yy,int xxx,int yyy,int ss)
18     {
19         x1=xx;y1=yy;x2=xxx;y2=yyy;s=ss;
20     }
21 }st,ed;
22 void bfs()
23 {
24     queue<node> q;
25     node now,next;
26     while(!q.empty())   q.pop();
27     q.push(node(st.x1,st.y1,st.x2,st.y2,0));
28     while(!q.empty())
29     {
30         now=q.front();
31         q.pop();
32         //printf("%d %d %d %d %d\n",now.x1,now.y1,now.x2,now.y2,now.s);
33         if(fabs(now.x1-now.x2)+fabs(now.y1-now.y2)<2)
34         {
35             printf("%d\n",now.s);
36             return;
37         }
38         for(int i=0;i<4;i++)            //肯定有一个棋子是移动的,以这个棋子作为判断依据
39         {
40             next.x1=now.x1+d1[i][0];
41             next.y1=now.y1+d1[i][1];
42             next.x2=now.x2+d2[i][0];
43             next.y2=now.y2+d2[i][1];
44             if(next.x1<0||next.x1>=n||next.y1<0||next.y1>=m||s[next.x1][next.y1]==‘X‘) continue;       //这棋子必须移动
45             if(next.x2<0||next.x2>=n||next.y2<0||next.y2>=m||s[next.x2][next.y2]==‘X‘)
46             {
47                 next.x2=now.x2,next.y2=now.y2;
48             }
49             if(vis[next.x1][next.y1][next.x2][next.y2]) continue;
50             vis[next.x1][next.y1][next.x2][next.y2]=1;
51             next.s=now.s+1;
52             q.push(next);
53         }
54     }
55     printf("Bad Luck!\n");
56 }
57 int main()
58 {
59     int i,j,k;
60     freopen("1.in","r",stdin);
61     while(scanf("%d%d",&n,&m)!=EOF)
62     {
63         for(i=0;i<n;i++)
64         {
65             scanf("%s",s[i]);
66             for(j=0;j<m;j++)
67             {
68                 if(s[i][j]==‘Z‘)    st.x1=i,st.y1=j;
69                 if(s[i][j]==‘S‘)    st.x2=i,st.y2=j;
70             }
71         }
72         memset(vis,0,sizeof(vis));
73         bfs();
74     }
75     return 0;
76 }
时间: 2024-10-12 15:42:49

hdu 2216 bfs的相关文章

hdu 1175 bfs 转弯题

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 和之前的1728类似.就是判断转弯数,建立一个用于记录转弯数的数组.. 还有就是对于特殊情况要进行考虑,比如起点与终点相同的情况,对于本题来说是不可以消去的应该输出NO.还有就是起点或终点是零这也是不行的,因为0代表没有棋子... 还有在判断能不能走的时候要小心,对于判断条件一定要小心,不要图赶快写.. 错误的地方都写在注释中了.. 代码: // hdu 1175 bfs 转弯数 //1.起点

Saving Princess claire_(hdu 4308 bfs模板题)

http://acm.hdu.edu.cn/showproblem.php?pid=4308 Saving Princess claire_ Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2305    Accepted Submission(s): 822 Problem Description Princess claire_ wa

HDU 1072 bfs

Nightmare Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7083    Accepted Submission(s): 3409 Problem Description Ignatius had a nightmare last night. He found himself in a labyrinth with a tim

hdu 1252 BFS

1 /* 2 题意:给出一个m*m矩阵表示的完全图,且每个点都有自环,每条边都有一种颜色:有三个玩家ABC的三张纸片分别初始在 3 某三个位置(可以重叠),纸片可以沿着边走一步,可以走的路径的规则为:若A要走到某个点i,则A-i的颜色要和B-C的颜 4 色相同:问最少要走多少步.(题意太难懂了,看了别人的说明才弄懂了题意) 5 6 题解:BFS 7 首先初步分析题意似乎很难用图论来解决,那么就是搜索/DP/数据结构,然后从搜索方面去思考的话,就是要找状态,然 8 后初步列出所有信息,三个点得位置

hdu 4707 bfs

bfs基础算法水题 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> #include<vector> #include<queue> using namespace std; const int Max = 1e5+50; int dist[Max]; vector<int> t

hdu - 2216 Game III &amp;&amp; xtu 1187 Double Maze (两个点的普通bfs)

http://acm.hdu.edu.cn/showproblem.php?pid=2216 zjt和sara在同一个地图里,zjt要去寻找sara,zjt每移动一步sara就要往相反方向移动,如果他们相邻或者在同一个格子里就算相遇. 输出最少步数.注意zjt每次必须要有能移动的点才移动,否则不能移动,但是sara没有能移动的点的话可以呆着不动. 用结构体保存两个点和相应的步数作为一个状态,然后用哈希函数映射出每一个状态的的哈希值,放入set中,判重. 注意哈希函数的选取要确保不能重复. 1 #

HDU 2216 Game III(BFS)

Problem Description Zjt and Sara will take part in a game, named Game III. Zjt and Sara will be in a maze, and Zjt must find Sara. There are some strang rules in this maze. If Zjt move a step, Sara will move a step in opposite direction.Now give you

[hdu 2102]bfs+注意INF

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 感觉这个题非常水,结果一直WA,最后发现居然是0x3f3f3f3f不够大导致的--把INF改成INF+INF就过了. #include<bits/stdc++.h> using namespace std; bool vis[2][15][15]; char s[2][15][15]; const int INF=0x3f3f3f3f; const int fx[]={0,0,1,-1};

hdu 1226 BFS + bfs记录路径

http://acm.hdu.edu.cn/showproblem.php?pid=1226 为了省空间,可以用vis数组初始化的时候初始化为-1, 发现一个BFS容易错的地方 开始一直WA在这里:就是我int tp=q.front();之后马上q.pop():了,然后才去判断是不是符合条件以break,这样就不能根据q.empty()==1认为没有找到ans 因为这里WA了 其实也可以vis[0] == -1来判断 比较不理解的是 当n==0的时候 %n==0的时候怎么处理 //#pragma