poj1657解题报告

http://poj.org/problem?id=1657

题目不难 主要就是 考虑每种棋子最短的走法 在使用变量时 里外层使用了同一个变量 i 还有是scnaf()后面没加getchar() WA了几次 下次一定要细心

dx==dy 说明在一条斜线上

棋盘上所有的斜线倾斜角都是45

王min(dx,dy)+abs(x-y) 相当于梯形 走一个斜线再走直线

代码如下:

 1 #include<iostream>
2 #include<cstdio>
3 using namespace std;
4 template<class T>
5 T abs(T a)
6 {
7 return a>0?a:-a;
8 }
9 int king(int dx,int dy)//王走的最短路径是一个梯形课一切成一个等腰直角三角形 上下底的差和高的值相等
10 {
11 int min,answer;
12 min=dx<dy?dx:dy;
13 answer=min+abs(dx-dy);
14 return answer;
15 }
16 int queen(int dx,int dy)
17 {
18 int answer;
19 if(dx==dy || dx==0 || dy==0)
20 {
21 answer=1;
22 }
23 else
24 {
25 answer=2;
26 }
27 return answer;
28 }
29 int elephant(int x1,int y1,int x2,int y2,int dx,int dy)
30 {
31 bool white_or_black[2];
32 if(abs(y1-x1)%2==1)
33 white_or_black[0]=1;
34 else
35 white_or_black[0]=0;
36 if(abs(y2-x2)%2==1)
37 white_or_black[1]=1;
38 else
39 white_or_black[1]=0;
40 if(white_or_black[0]!=white_or_black[1])
41 return -1;
42 else
43 {
44 if(dx==dy)
45 return 1;
46 else
47 return 2;
48 }
49 }
50 int car(int dx,int dy)
51 {
52 if(dx==0||dy==0)
53
54 return 1;
55 else
56 return 2;
57 }
58 int main()
59 {
60 int x1,y1,x2,y2,i,j,k,dx,dy;
61 char a,b;
62 int step[5],ncase;
63 scanf("%d",&ncase);
64 getchar();
65 for(i=0;i<ncase;i++)
66 {
67
68
69
70 scanf("%c%d %c%d",&a,&x1,&b,&x2);
71 getchar();
72 y1=int (a-'a');
73 y2=int (b-'a');
74 dx=abs(x1-x2);
75 dy=abs(y1-y2);
76 step[0]=king(dx,dy);
77 step[1]=queen(dx,dy);
78 step[3]=elephant(x1,y1,x2,y2,dx,dy);
79 step[2]=car(dx,dy);
80 if(dx==0&&dy==0)
81 {
82 printf("0 0 0 0\n");
83 continue;
84 }
85 for(j=0;j<3;j++)
86 {
87 printf("%d ",step[j]);
88 }
89 if(step[3]!=-1)
90 printf("%d\n",step[3]);
91 else
92 printf("Inf\n");
93
94
95 }
96 //system("pause");
97 return 0;
98 }

原文地址:https://www.cnblogs.com/yujiaao/p/2114855.html