uva1589(象棋)。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uva1589(象棋)。相关的知识,希望对你有一定的参考价值。

这个题昨天晚上做到一点半还是WA,早上起来后认真思考了一下终于AC....

细节比较多,我第一次AC的代码写了350多行,我考虑了黑将能吃子的情况,

我把那种情况去掉后也可以AC,应该没有很BT的数据。

思路就是弄两个二维数组,一个模拟红棋可以杀的范围,另一个模拟黑将到达的位置,再判断是否处于红棋击杀范围之内就好了。

第一次AC的代码太长,下面是第二次AC的代码(把黑将能吃子的情况去掉了)。

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstdlib>
  4 #include <algorithm>
  5 #include <cstring>
  6 
  7 using namespace std;
  8 int a[11][10];
  9 int Map[11][10];//如果不考虑黑将吃子的话这个用不到。
 10 int book[11][10];
 11 int p,q;
 12 struct chess
 13 {
 14     char ch;
 15     int r,c;
 16 };
 17 struct chess che[101];
 18 
 19 int judge(int r,int c)
 20 {
 21     int flag = 0,i,j;
 22     int next[4][2] = { {1,0},{-1,0},{0,-1},{0,1} };
 23     int nextx,nexty;
 24     for(i=0; i<4; i++)
 25     {
 26         nextx = r+next[i][0];
 27         nexty = c+next[i][1];
 28         if(nextx>3||nextx<1||nexty>6||nexty<4)
 29             continue;
 30         if(a[nextx][nexty]==0)
 31             flag = 1;
 32     }
 33     if(flag)
 34         return 0;
 35     else
 36         return 1;
 37 }
 38 void kill(char ch,int r, int c)
 39 {
 40     int i,j;
 41     if(ch == R)
 42     {
 43         for(i=r-1; i>0; i--)
 44         {
 45             if(book[i][c])
 46             {
 47                 a[i][c]++;
 48                 break;
 49             }
 50             else
 51                 a[i][c]++;
 52         }
 53         for(i=r+1; i<=10; i++)
 54         {
 55             if(book[i][c])
 56             {
 57                 a[i][c]++;
 58                 break;
 59             }
 60             else
 61                 a[i][c]++;
 62         }
 63         for(i=c+1; i<=10; i++)
 64         {
 65             if(book[r][i])
 66             {
 67                 a[r][i]++;
 68                 break;
 69             }
 70             else
 71                 a[r][i]++;
 72         }
 73         for(i=c-1; i>0; i--)
 74         {
 75             if(book[r][i])
 76             {
 77                 a[r][i]++;
 78                 break;
 79             }
 80             else
 81                 a[r][i]++;
 82         }
 83     }
 84     else if(ch == H)
 85     {
 86         int next[4][2] = { {1,0},{-1,0},{0,-1},{0,1} };
 87         for(i=0; i<4; i++)
 88         {
 89             if(i<=1)
 90             {
 91                 if(r+2*next[i][0]<1||r+2*next[i][0]>10||r+next[i][0]<1||r+next[i][0]>10
 92                         ||c+next[i][1]+1<1||c+next[i][1]+1>9||c+next[i][1]<1||c+next[i][1]>9)
 93                     continue;
 94                 if(!book[r+next[i][0]][c+next[i][1]])
 95                 {
 96                     a[r+2*next[i][0]][c+next[i][1]+1]++;
 97                     a[r+2*next[i][0]][c+next[i][1]-1]++;
 98                 }
 99             }
100             else
101             {
102                 if(r+next[i][0]<1||r+next[i][0]>10||r+next[i][0]+1<1||r+next[i][0]+1>10
103                         ||c+next[i][1]<1||c+next[i][1]>9||c+2*next[i][1]<1||c+2*next[i][1]>9)
104                     continue;
105                 if(!book[r+next[i][0]][c+next[i][1]])
106                 {
107                     a[r+next[i][0]+1][c+2*next[i][1]]++;
108                     a[r+next[i][0]-1][c+2*next[i][1]]++;
109                 }
110             }
111         }
112     }
113     else if(ch == C)
114     {
115         int flag = 0;
116         for(i=r-1; i>=1; i--)
117         {
118             if(flag==2)break;
119             if(flag ==1)
120             {
121                 a[i][c]++;
122             }
123             if(book[i][c])
124                 flag++;
125         }
126         flag = 0;
127         for(i=r+1; i<=10; i++)
128         {
129             if(flag==2)break;
130             if(flag ==1)
131             {
132                 a[i][c]++;
133             }
134             if(book[i][c])
135                 flag++;
136         }
137         flag = 0;
138         for(i=c+1; i<=10; i++)
139         {
140             if(flag==2)break;
141             if(flag ==1)
142             {
143                 a[r][i]++;
144             }
145             if(book[r][i])
146                 flag++;
147         }
148         flag = 0;
149         for(i=c-1; i>0; i--)
150         {
151             if(flag==2)break;
152             if(flag ==1)
153             {
154                 a[r][i]++;
155             }
156             if(book[r][i])
157                 flag++;
158         }
159     }
160     else if(ch == G)
161     {
162         int flag = 0;
163         for(i=r-1; i>p; i--)
164         {
165             if(book[i][c])
166                 flag = 1;
167         }
168         if(!flag)
169         {
170             for(i=p; i<=3; i++)
171                 a[i][c]++;
172         }
173     }
174 }
175 int main()
176 {
177     int n,i,j,k;
178     while(cin >> n >> p >> q && n && p && q)
179     {
180         for(i=0; i<n; i++)
181         {
182             cin >> che[i].ch >> che[i].r >> che[i].c;
183             book[che[i].r][che[i].c] = 1;
184         }
185         for(i=0; i<n; i++)
186             kill(che[i].ch,che[i].r,che[i].c);
187         if(judge(p,q))
188             cout << "YES" << endl;
189         else
190             cout << "NO" << endl;
191         memset(a,0,sizeof(a));
192         memset(book,0,sizeof(book));
193     }
194     return 0;
195 }

 

以上是关于uva1589(象棋)。的主要内容,如果未能解决你的问题,请参考以下文章

UVA-1589 象棋(模拟)

UVa1589 Xiangqi 坑点总结+参考代码

UVA1589 Xiangqi(挖坑待填)

UVA 1589 Xiangqi

Xiangqi UVA - 1589

uva1589