uva159 象棋

这道题看起来非常复杂,,,看了看大佬们的代码感觉太优秀了。。。。。用最简单的方法考虑所有未知。。。。。。。不浪费一行代码/。。。

  1 #include <stdio.h>
  2 
  3 #include <stdlib.h>
  4 
  5 #include <string.h>
  6 
  7 char a[15][15];
  8 
  9 const int dr[4]= {-1,1,0,0},dc[4]= {0,0,-1,1};
 10 
 11 const int Horser[8]= {-2,-2,-1,-1,1,1,2,2};
 12 
 13 const int Horsec[8]= {-1,1,-2,2,-2,2,-1,1};
 14 
 15 const int Stoner[8]= {-1,-1,-1,-1,1,1,1,1};
 16 
 17 const int Stonec[8]= {-1,1,-1,1,-1,1,-1,1};
 18 
 19 int check(int r,int c)//返回值为0表示安全,1表示不安全
 20 
 21 {
 22 
 23     int i,j,t,patten;
 24 
 25     for(t=0; t<=3; t++)
 26 
 27     {
 28 
 29         patten=1;
 30 
 31         for(i=r+dr[t],j=c+dc[t]; i>=1&&i<=10&&j>=1&&j<=9; i+=dr[t],j+=dc[t])
 32 
 33         {
 34 
 35             if(patten==1)//找车将
 36 
 37             {
 38 
 39                 if(a[i][j])
 40 
 41                 {
 42 
 43                     if(a[i][j]=='G'||a[i][j]=='R')
 44 
 45                         return 1;
 46 
 47                     else
 48 
 49                         patten=2;
 50 
 51                 }
 52 
 53             }
 54 
 55             else if(patten==2)//找炮
 56 
 57             {
 58 
 59                 if(a[i][j])
 60 
 61                 {
 62 
 63                     if(a[i][j]=='C')
 64 
 65                         return 1;
 66 
 67                     else
 68 
 69                         break;
 70 
 71                 }
 72 
 73             }
 74 
 75         }
 76 
 77     }
 78 
 79     for(i=0; i<=7; i++)//找马
 80 
 81     {
 82 
 83         if(!(r+Horser[i]>=1&&r+Horser[i]<=10&&c+Horsec[i]>=1&&c+Horsec[i]<=9))
 84 
 85             continue;
 86 
 87         if(a[r+Horser[i]][c+Horsec[i]]=='H'&&!a[r+Stoner[i]][c+Stonec[i]])
 88 
 89             return 1;
 90 
 91     }
 92 
 93     return 0;
 94 
 95 }
 96 
 97 int main()
 98 
 99 {
100 
101     int i,n,r,c,rr,cc,result;
102 
103     char ch;
104 
105     while(1)
106 
107     {
108 
109         memset(a,0,sizeof a);
110 
111         result=1;
112 
113         scanf("%d%d%d",&n,&r,&c);
114 
115         if(!n&&!r&&!c)
116 
117             break;
118 
119         for(i=0; i<=n-1; i++)
120 
121         {
122 
123             scanf(" %c%d%d",&ch,&rr,&cc);
124 
125             a[rr][cc]=ch;
126 
127         }
128 
129         for(i=r+1; i<=10; i++)
130 
131         {
132 
133             if(a[i][c])
134 
135             {
136 
137                 if(a[i][c]=='G')
138 
139                     result=0;
140 
141                    break;
142 
143             }
144 
145         }
146 
147         if(result)
148 
149         {
150 
151             for(i=0; i<=3; i++)
152 
153             {
154 
155                 if(r+dr[i]<1||r+dr[i]>3||c+dc[i]<4||c+dc[i]>6)
156 
157                     continue;
158 
159                 if(!check(r+dr[i],c+dc[i]))
160 
161                 {
162 
163                     result=0;
164 
165                     break;
166 
167                 }
168 
169             }
170 
171         }
172 
173         if(result)
174 
175             printf("YES\n");
176 
177         else
178 
179             printf("NO\n");
180 
181     }
182 
183     return 0;
184 
185 }

此题中关于棋子的行走方法设计十分·巧妙此类的方法感觉受益匪浅。。。。

猜你喜欢

转载自www.cnblogs.com/jrjxt/p/10457009.html
今日推荐