Problem 1490 五子棋.
思路
- AC的思路
最后一步落子的人,一定是胜利的人!
- 第一个版本的思路WA
二维数组存放棋局:0表示该位置没有棋子,B表示是黑子,W表示是白子
① 读入数组fir[20][20]
② 从上往下,左往右遍历每个位置:
a.该位置(向右)有4个同色棋子——第五个位置也同色/两侧没有不同色的棋子,返回true
b.该位置(向下)有4个同色棋子——第五个位置也同色/两侧没有不同色的棋子,返回true
c.该位置(向左下)有4个同色棋子——第五个位置也同色/两侧没有不同色的棋子,返回true
d.该位置(向右下)有4个同色棋子——第五个位置也同色/两侧没有不同色的棋子,返回true
WA点不明……样例都能跑啊哭,然后我去看了一下题解,瞬间怀疑人生脑袋没了!
代码
#include<cstdio>
#include<string.h>
using namespace std;
char color[2] = {'B', 'W'};
int main(){
char op[4], ans;
int sum;
while(scanf("%s", op)!=EOF){
sum = 0;
while(strcmp(op, "END")!=0){
ans = color[sum%2];
sum++;
scanf("%s", op);
}
printf("%c %d\n", ans, sum);
}
return 0;
}
#include<cstdio>
#include<string.h>
using namespace std;
char fir[31][31];
char color[2] = {'B', 'W'};
bool fun(int i, int j){
char flag = fir[i][j];
if(fir[i][j+1]==flag && fir[i][j+2]==flag && fir[i][j+3]==flag){
if((fir[i][j+4]==flag) || (fir[i][j-1]=='0' && fir[i][j+4]=='0'))
return true;
}else if(fir[i-1][j]==flag && fir[i-2][j]==flag && fir[i-3][j]==flag){
if((fir[i-4][j]==flag) || (fir[i+1][j]=='0' && fir[i-4][j]=='0'))
return true;
}else if(fir[i-1][j+1]==flag && fir[i-2][j+2]==flag && fir[i-3][j+3]==flag){
if((fir[i-4][j+4]==flag) || (fir[i+1][j-1]=='0' && fir[i-4][j+4]=='0'))
return true;
}else if(fir[i-1][j-1]==flag && fir[i-2][j-2]==flag && fir[i-3][j-3]==flag){
if((fir[i-4][j-4]==flag) || (fir[i+1][j+1]=='0' && fir[i-4][j-4]=='0'))
return true;
}else
return false;
}
int main(){
char op[4], ans;
int sum;
while(scanf("%s", op)!=EOF){
memset(fir, '.', sizeof(fir));
sum = 0;
ans = '.';
while(strcmp(op, "END")!=0){
fir[op[1]-'1'+5][op[0]-'A'+5] = color[sum%2];
sum++;
scanf("%s", op);
}
for(int i=30; i>=0; i--){
for(int j=0; j<=30; j++){
if(fun(i, j) && fir[i][j]!='.'){
ans = fir[i][j];
break;
}
}
if(ans!='.')
break;
}
printf("%c %d\n", ans, sum);
}
return 0;
}