昨天的比赛题!最后一小时几乎都在做这题!一直觉得考虑的挺清楚了!可是无限WA!心里那个郁闷啊 !今天又翻出来做,还是各种欠考虑!没办法了!
跑去翻人家的解题报告!才恍然大悟啊!以为女王能走直线就一直线的判断,碰到白王挡在前面的情况没有考虑进去!还有要判断黑王不动的情况!
1 #include <iostream>
2 #include <string>
3 usingnamespace std ;
4 string wk, wq, bk ;
5 // 最后一组是不移动的情况
6 int dir[9][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1},{0,0}};
7 bool check(char wqx,char wqy)
8 {
9 int d,i,dwk,dwq;
10 char x,y,dx,dy;
11 // 检查黑色王是否被将死
12 for(d=0;d<9;++d)
13 {
14 x=bk[0]+dir[d][0];
15 y=bk[1]+dir[d][1];
16 if(x<'a'||x>'h'||y<'1'||y>'8')
17 continue ;
18 bool flag=false ;
19 for(dwk=0;dwk<8;++dwk)
20 {
21 dx=wk[0]+dir[dwk][0] ;
22 dy=wk[1]+dir[dwk][1] ;
23 // 白色王可以吃掉黑色王
24 if(dx==x&&dy==y)
25 {
26 flag=true;
27 break;
28 }
29 }
30 for(dwq=0;!flag&&dwq<8;++dwq)
31 {
32 for(i=1;;++i)
33 {
34 dx=wqx+i*dir[dwq][0];
35 dy=wqy+i*dir[dwq][1];
36 // 越界
37 if(dx<'a'||dx>'h'||dy<'1'||dy>'8')
38 break ;
39 // 白色后可以吃掉黑色王
40 if(x==dx&&y==dy)
41 {
42 flag=true;
43 break;
44 }
45 // 要穿过白色王,不能跃子
46 if(dx==wk[0]&&dy==wk[1])
47 break ;
48 }
49 }
50 // 一步没能将死
51 if(!flag)
52 returnfalse ;
53 }
54 returntrue ;
55 }
56
57 int main()
58 {
59 char x,y;
60 int d,i;
61 while(cin>>wk>>wq>>bk)
62 {
63 bool yes=false ;
64 for(d=0;!yes&&d<8;++d)
65 {
66 for(i=1;;++i)
67 {
68 x=wq[0]+i*dir[d][0] ;
69 y=wq[1]+i*dir[d][1] ;
70 if(x<'a'||x>'h'||y<'1'||y>'8') // 越界
71 break ;
72 // 不能跃子,对于一步可以把黑王吃掉的情况,判断不判断都可以,下面的是测试的代码
73 if((x==wk[0]&&y==wk[1])||(x==bk[0]&&y==bk[1]))
74 break ;
75 if(check(x,y))
76 {
77 yes =true ;
78 break;
79 }
80 }
81 }
82 if(yes)
83 printf("%c%c\n",x,y);
84 else
85 printf("no\n");
86 }
87 return0 ;
88 }
无限郁闷啊!看的报告人家是一步一步走得 ,只要判断碰到白王就停止就好了! 就是八方向的搜索!一直走到底就好!
8*8的表格!也不怕超时!附上代码!感慨一下!!