地址

福州赛区的A题,我们队因为没有过这个题导致最后的悲剧,废话不多说了,下面是简单的分析+代码.

首先我们可以设置一个map[][]数组记录某个点有没有子,然后让将做四个方向,再判断是否会被吃掉,如果有一个方向不会被吃掉,那么就不是死棋,否则就是。

判断是否会被吃掉的时候,如果是帅,就判断y坐标相等,且中间无子,车的判断类似。炮的判断可以变为炮和将中间有几个子,一个的话就ok,否则炮吃不了将。马的话,考虑不能走就行了。

代码如下:



1. #include
2. #include
3. #include
4. #include
5.
6. char role[30];
7. int x[30],y[30];
8. int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0 }} ;
9. int hdir[8][2]= {{ -1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1},{-2,1 }} ;
10. int X,Y;
11. int n;
12. bool have[30][30];
13.
14. int min(int a,int b)
15. {
16. return a
17. }
18. int max(int a,int b)
19. {
20. return a>b?a:b;
21. }
22.
23. bool can(int X,int Y)
24. {
25. int i,j;
26. int cnt;
27. int tx,ty;
28. for(i=0i
29. {
30. if(!have[x[i]][y[i]])
31. continue
32. //G
33. if(‘G’==role[i])
34. {
35. if(y[i]==Y)
36. {
37. for(j=min(X,x[i])+1j
38. {
39. if(have[j][Y])
40. break
41. }
42. if(j==max(X,x[i]))
43. return false
44. }
45. }
46. //R
47. if(‘R’==role[i])
48. {
49. if(Y==y[i])
50. {
51. for(j=min(X,x[i])+1j
52. {
53. if(have[j][Y])
54. break
55. }
56. if(j==max(X,x[i]))
57. return false
58. }
59. if(X==x[i])
60. {
61. for(j=min(Y,y[i])+1j
62. if(have[X][j])
63. break
64. if(j==max(Y,y[i]))
65. return false
66. }
67. }
68. //C
69. if(‘C’==role[i])
70. {
71. if(X==x[i])
72. {
73. cnt=0
74. for(j=min(Y,y[i])+1j
75. if(have[X][j])
76. ++cnt;
77. if(1==cnt)
78. return false
79. }
80. if(Y==y[i])
81. {
82. cnt=0
83. for(j=min(X,x[i])+1j
84. if(have[j][Y])
85. ++cnt;
86. if(1==cnt)
87. return false
88. }
89. }
90. //H
91. if(‘H’==role[i])
92. {
93. for(j=0j<8;++j)
94. {
95. tx = x[i]+hdir[j][0];
96. ty = y[i]+hdir[j][1];
97. if(tx<1||tx>10||ty<1||ty>9)
98. continue
99. int sbx,sby;
100. sbx = x[i]+hdir[j][0]/2
101. sby = y[i]+hdir[j][1]/2
102. if(have[sbx][sby])
103. continue
104. if(tx==X&ty==Y)
105. return false
106. }
107. }
108. }
109. return true
110. }
111.
112. int main(void)
113. {
114. #ifndef ONLINE_JUDGE
115. freopen(“1001.in”,“r”,stdin);
116. freopen(“1001.out”,“w”,stdout);
117. #endif
118. int i;
119. int tx,ty;
120. bool tmp;
121. char ch;
122. while(EOF!=scanf(“%d%d%d”,n,&X,&Y))
123. {
124. if(0==n&0==X&&0==Y)
125. break
126.
127. memset(have,false,sizeof(have));
128. for(i=0i
129. {
130. ch=getchar();
131. while(!(ch>=’A’&ch<=’Z’))
132. ch=getchar();
133. role[i]=ch;
134. scanf(“%d%d”,x[i],&y[i]);
135. have[x[i]][y[i]]=true
136. }
137. for(i=0i<4;++i)
138. {
139. tx = X+dir[i][0];
140. ty = Y+dir[i][1];
141. if(tx<1||tx>3||ty<4||ty>6)
142. continue
143. tmp = have[tx][ty];
144. have[tx][ty]=false
145. if(can(tx,ty))
146. {
147. break
148. }
149. have[tx][ty]=tmp;
150. }
151.
152. if(4==i)
153. {
154. printf(“YES\n”);
155. }
156. else
157. {
158. printf(“NO\n”);
159. }
160. }
161. return 0
162. }

Comments