UVA 1589 Xiangqi

思路、代码来自:https://www.cnblogs.com/HsiaoYeekwan/p/6359934.html

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

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstdlib>
  4 #include <algorithm>
  5 #include <cstring>
  6 using namespace std;
  7 int a[11][10];//杀伤范围
  8 int book[11][10];//存放棋子
  9 int p,q;//黑棋的将
 10 struct chess{
 11     char ch;//棋子的内容,比如R,G,C,H
 12     int r,c;//棋子的坐标
 13 }che[101];//棋子
 14 //计算杀伤范围
 15 void kill(char ch,int r,int c)
 16 {
 17     int i,j;
 18     if(ch=='R')//计算车的杀伤范围
 19     {
 20         //将此棋子往上和往下的所有没有障碍的位置记为可以被杀死的,
 21         //遇到棋子(book[i][c]==1),就记下此位置(因为这个地方有棋子了),然后break
 22         for(i=r-1;i>0;i--)
 23         {
 24             if(book[i][c]==1)
 25                 {
 26                     a[i][c]++;
 27                     break;
 28                 }
 29                 else
 30                     a[i][c]++;
 31         }
 32         for(i=r+1;i<=10;i++)
 33         {
 34             if(book[i][c])
 35             {
 36                 a[i][c]++;
 37                 break;
 38             }
 39             else
 40                 a[i][c]++;
 41         }
 42         for(j=c-1;j>0;j--)
 43         {
 44             if(book[r][j])
 45                 {
 46                     a[r][j]++;
 47                     break;
 48                 }
 49                 else
 50                     a[r][j]++;
 51         }
 52         for(j=c+1;j<=9;j++)
 53         {
 54             if(book[r][j])
 55                 {
 56                     a[r][j]++;
 57                     break;
 58                 }
 59                 else
 60                     a[r][j]++;
 61         }
 62     }
 63     else
 64         if(ch=='H')//棋子是马
 65     {
 66         //先判断会不会越界,然后判断有没有被蹩脚,没有就加入可以被杀死的标记
 67         int next[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
 68         for(i=0;i<4;i++)
 69         {
 70             if(i<=1)
 71             {
 72                 if(r+2*next[i][0]<1||r+2*next[i][0]>10||r+next[i][0]<1||r+next[i][0]>10||c-1<1||c-1>9||c+1<1||c+1>9)
 73                     continue;//注意判断r+next[i][0]
 74                 if(book[r+next[i][0]][c]==0)
 75                     {
 76                         a[r+2*next[i][0]][c+1]++;
 77                         a[r+2*next[i][0]][c-1]++;
 78                     }
 79             }
 80             else
 81             {
 82 
 83                 if(c+2*next[i][1]<1||c+2*next[i][1]>9||c+next[i][1]<1||c+next[i][1]>9||r<1||r>10||r+1<1||r+1>10)
 84                     continue;
 85                 if(book[r][c+next[i][1]]==0)
 86                     {
 87                         a[r+1][c+2*next[i][1]]++;
 88                         a[r-1][c+2*next[i][1]]++;
 89                     }
 90             }
 91         }
 92     }
 93     else if(ch=='C')//
 94     {
 95         //分别用flag标志从炮往四个方向
 96         //遇到的棋子数,flag==2结束,而flag==1表示此位置到炮之间已经有一个棋子
 97         int flag=0;
 98         for(i=r-1;i>0;i--)
 99         {
100             if(flag==2)
101                 break;
102             if(flag==1)
103                 a[i][c]++;
104             if(book[i][c])
105                 flag++;
106         }
107         flag=0;
108         for(i=r+1;i<=10;i++)
109         {
110             if(flag==2)
111                 break;
112             if(flag==1)
113                 a[i][c]++;
114             if(book[i][c])
115                 flag++;
116         }
117         flag=0;
118         for(j=c-1;j>0;j--)
119         {
120             if(flag==2)
121                 break;
122             if(flag==1)
123                 a[r][j]++;
124             if(book[r][j])
125                 flag++;
126         }
127         flag=0;
128         for(j=c+1;j<=9;j++)
129         {
130             if(flag==2)
131                 break;
132             if(flag==1)
133                 a[r][j]++;
134             if(book[r][j])
135                 flag++;
136         }
137     }
138     else
139         if(ch=='G')//将、帅
140     {
141         int flag=0;//标志中间有没有棋子做障碍
142         for(i=r-1;i>p;i--)
143         {
144             if(book[i][c])
145                 flag=1;
146         }
147         if(flag==0)
148         {
149             for(i=p;i<=3;i++)
150                 a[i][c]++;
151         }
152     }
153 }
154 
155 int judge(int r,int c)
156 {
157     int flag=0,i,j;
158     int next[4][2]={{1,0},{-1,0},{0,-1},{0,1}};
159     int nextx,nexty;
160     for(i=0;i<4;i++)
161     {
162         nextx=r+next[i][0];
163         nexty=c+next[i][1];
164         if(nextx>3||nextx<1||nexty>6||nexty<4)
165             continue;
166         if(a[nextx][nexty]==0)
167             flag=1;
168     }
169     if(flag)
170         return 0;
171     else
172         return 1;
173 }
174 int main()
175 {
176     int i,j,k,n;
177     while(cin>>n>>p>>q&&n&&p&&q)
178     {
179         for(i=0;i<n;i++)
180         {
181             cin>>che[i].ch>>che[i].r>>che[i].c;
182             book[che[i].r][che[i].c]=1;
183         }
184         for(i=0;i<n;i++)
185             kill(che[i].ch,che[i].r,che[i].c);
186 //        //输出修改后的查看
187 //        cout<<"after a: "<<endl;
188 //        for(i=1;i<=10;i++)
189 //        {
190 //            for(j=1;j<10;j++)
191 //                cout<<a[i][j]<<" ";
192 //            cout<<endl;
193 //        }
194 //        cout<<"after book: "<<endl;
195 //        for(i=1;i<=10;i++)
196 //        {
197 //            for(j=1;j<10;j++)
198 //                cout<<book[i][j]<<" ";
199 //            cout<<endl;
200 //        }
201         if(judge(p,q))
202             cout<<"YES"<<endl;
203         else
204             cout<<"NO"<<endl;
205         memset(a,0,sizeof(a));
206         memset(book,0,sizeof(book));
207     }
208     return 0;
209 }

 

posted @ 2019-01-24 21:34  付玬熙  阅读(103)  评论(0编辑  收藏  举报