[HDU 1372] Knight Moves
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1372
题目描述:
在一个棋盘中,给你两个点的坐标,同时,你有八种走法,当然题目没明确说,但是这种棋盘就是这种规则。
求:从第一个点都第二个点的最少步数;
注意:
1.因为坐标是字母加数字的形式,注意下输入格式
2.如果用scanf读取输入,那么别忘了加!=EOF,否则会报 Output limit error 错误
3. 如果输入坐标的时候全部按字符格式输入的,在转成数字的时候,字母减掉 ‘a’ ,那么数字要减掉 ‘1’ ,这样横纵坐标的范围才能控制在 0-7
1 //cin字母加数字输入
2 #include<iostream>
3 #include<cstring>
4 #include<queue>
5 #include<cstdio>
6 using namespace std;
7
8 char c1,c2;
9 int sxx,exx;
10 int sx,sy,ex,ey;
11 int go[8][2] = {
1,2,2,1,2,-1,1,-2,-1,-2,-2,-1,-2,1,-1,2};
12 bool vis[10][10];
13 struct node
14 {
15 int x,y;
16 int count;
17 };
18
19 bool check(node s)
20 {
21 if(s.x>=0&&s.x<8&&s.y>=0&&s.y<8)
22 return 1;
23 else
24 return 0;
25 }
26 void bfs()
27 {
28 queue<node> Q;
29 node now,nex;
30 now.x = sx;now.y = sy;
31 now.count = 0;
32 vis[now.x][now.y] = 1;
33 Q.push(now);
34 while(!Q.empty())
35 {
36 now = Q.front();
37 Q.pop();
38 if(now.x==ex&&now.y==ey)
39 {
40 printf("To get from %c%d to %c%d takes %d knight moves.\n",c1,sxx,c2,exx,now.count);
41 return ;
42 }
43 for(int i=0;i<8;i++)
44 {
45 nex.x = now.x + go[i][0];
46 nex.y = now.y + go[i][1];
47 if(check(nex)&&!vis[nex.x][nex.y])
48 {
49 vis[nex.x][nex.y] = 1;
50 nex.count = now.count + 1;
51 Q.push(nex);
52 }
53 }
54 }
55 cout<<"0"<<endl;
56 }
57
58 int main()
59 {
60 while(cin>>c1>>sxx>>c2>>exx)
61 {
62 sy = c1 - 'a';
63 sx = sxx - 1;
64 ey = c2 - 'a';
65 ex = exx - 1;
66 memset(vis,0,sizeof(vis));
67 bfs();
68 }
69 return 0;
70 }
1 //scanf字符数组输入
2 #include<iostream>
3 #include<cstring>
4 #include<queue>
5 #include<cstdio>
6 using namespace std;
7
8 char s1[3],s2[3];
9 int sx,sy,ex,ey;
10 int go[8][2] = {
1,2,2,1,2,-1,1,-2,-1,-2,-2,-1,-2,1,-1,2};
11 bool vis[10][10];
12 struct node
13 {
14 int x,y;
15 int count;
16 };
17
18 bool check(node s)
19 {
20 if(s.x>=0&&s.x<8&&s.y>=0&&s.y<8)
21 return 1;
22 else
23 return 0;
24 }
25 void bfs()
26 {
27 queue<node> Q;
28 node now,nex;
29 now.x = sx;now.y = sy;
30 now.count = 0;
31 vis[now.x][now.y] = 1;
32 Q.push(now);
33 while(!Q.empty())
34 {
35 now = Q.front();
36 Q.pop();
37 if(now.x==ex&&now.y==ey)
38 {
39 printf("To get from %s to %s takes %d knight moves.\n",s1,s2,now.count);
40 return ;
41 }
42 for(int i=0;i<8;i++)
43 {
44 nex.x = now.x + go[i][0];
45 nex.y = now.y + go[i][1];
46 if(check(nex)&&!vis[nex.x][nex.y])
47 {
48 vis[nex.x][nex.y] = 1;
49 nex.count = now.count + 1;
50 Q.push(nex);
51 }
52 }
53 }
54 cout<<"0"<<endl;
55 }
56
57 int main()
58 {
59 while(scanf("%s%s",s1,s2)!=EOF)
60 {
61 sy = s1[0] - 'a';
62 sx = s1[1] - '1';
63 ey = s2[0] - 'a';
64 ex = s2[1] - '1';
65 memset(vis,0,sizeof(vis));
66 bfs();
67 getchar();
68 }
69 return 0;
70 }
转载于//www.cnblogs.com/youpeng/p/10242554.html
还没有评论,来说两句吧...