本地运行过,但就是WA,又调了很久,还是没找到错误,从网上找了篇AC代码想对比一下,但是细节变动有点大对比难度让人抓狂,不过很明显的是,两篇代码都还有很多值得优化的地方,索性合在一起大面积改动了一下,AC了,改动后的代码最大的特点就是思路更加清晰!说明模拟题,一要审好题意,二一定要把思路写清,重复的部分就拿出来合在一起,思路就会变得更清晰,代码也更简洁。
另外,没事少用全局变量。。。。。。。。。。。
代码:
#include <bits/stdc++.h>
using namespace std;
char cur,cur_con;
char tab[10][10];
int flag=1;
int flag_1=0;
const int dir[9][2]={{0,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1},{0,1},{-1,1},{-1,0}};
void now()
{
char t=cur;
cur=cur_con;
cur_con=t;
}
bool hefa(int r, int c)
{
if(tab[r][c]!='-') return false;
for(int i = 1; i <= 8; i++){
int rr = r+dir[i][0], cc = c+dir[i][1];
if(tab[rr][cc]==cur_con){
while(tab[rr][cc]!=0){
rr += dir[i][0]; cc += dir[i][1];
if(tab[rr][cc]==cur){
return true;
}
if(tab[rr][cc]=='-' ) break;
}
}
}
return false;
}
void L()
{
int numm=0;
for(int i = 1; i <= 8; i++)
for(int j = 1; j <= 8; j++){
if(hefa(i, j)){
if(numm++) printf(" (%d,%d)", i, j);
else printf("(%d,%d)", i, j);
}
}
if(!numm) printf("No legal move.\n");
else printf("\n");
}
void out_cnt()
{
int cnt1 = 0, cnt2 = 0;
for(int i = 1; i <= 8; i++){
for(int j = 1; j <= 8; j++){
if(tab[i][j]=='B') cnt1++;
if(tab[i][j]=='W') cnt2++;
}
}
printf("Black - %2d White - %2d\n", cnt1, cnt2);
}
void Mrc(const int r, const int c)
{
tab[r][c] = cur;
for(int i = 1; i <= 8; i++){
bool ok = false;
int rr = r+dir[i][0], cc = c+dir[i][1];
if(tab[rr][cc]==cur_con){
while(tab[rr][cc]!=0){
rr += dir[i][0]; cc += dir[i][1];
if(tab[rr][cc]==cur){
ok = true;
break;
}
if(tab[rr][cc]=='-' )
break;
}
}
if(ok){
rr = r, cc = c;
while(true){
rr += dir[i][0]; cc += dir[i][1];
if(tab[rr][cc]==cur) break;
else tab[rr][cc] = cur;
}
}
}
out_cnt();
}
void print()
{
for(int i = 1; i <= 8; i++)
puts(tab[i]+1);//还会自动换行啊?、
}
int main()
{
freopen("data_wang.txt", "r", stdin);
freopen("out_wang.txt", "w", stdout);
int T; cin >> T; //cin.get();
while(T--){
memset(tab, 0, sizeof(tab));
for(int i = 1; i <= 8; i++)
scanf("%s", tab[i]+1);
cin >> cur;
if(cur=='W')
cur_con='B';
else
cur_con='W';
string cmd;
while(cin >> cmd){
if(cmd=="L"){
L();
}
else if(cmd[0]=='M'){
int r = cmd[1]-'0', c = cmd[2]-'0';
if(!hefa(r, c)){
now();
Mrc(r, c);
now();
}
else if(hefa(r,c)){
Mrc(r, c);
now();
}
}
else if(cmd=="Q"){
print();
break;
}
}
if(T) printf("\n");
}
return 0;
}