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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步