1.21 D题 CodeForces - 825B
题目大意:
给一个10*10棋盘,上面有棋子 X 和 0, 找出在一个空处放一个子使X连成五子或以上。
解题思路:
正向思维:
1.找四个连一起的,然后判断是否可以在两端空位加棋子,这就要判断两端是否有空位;
2.找在中间加一个棋子可以把两个连在一起到比5大的。
反向思维:
找空位,判断垂直、水平、斜向是否有四个子或以上。
这个思路实现起来很容易,不过我在实现的时候重用了很多代码,写得很难看。
AC代码
#include<cstdio>
#include<iostream>
#include<queue>
#include<string>
#include<cmath>
#include<algorithm>
#include<limits.h>
#define rep(i,l,p) for(int i=l; i<=p; i++)
#define drep(i,p,l) for(int i=p; i>=l; i--)
using namespace std;
struct node{
int x,y;
node(int i,int j){
x = i;
y = j;
}
};
int n;
int a[13][13];
queue<node> que;
int main(){
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
char t;
rep(i,1,10){
rep(j,1,10){
cin >> t;
if ( t == 'X') a[i][j] = 1;
else if (t == 'O') a[i][j] = -1;
else {
node *tt = new node(i,j);
que.push(*tt);
}
}
}
// rep(i,1,10){
// rep(j,1,10) printf("%d ",a[i][j]);
// printf("\n");
// }
bool flag = false;
while( !que.empty() ){
node tmp = que.front();
que.pop();
int x = tmp.x, y = tmp.y;
// printf("x:%d y:%d\n",x,y);
int res = 0;
while( !flag ){
y--;
if (y < 1 ) break;
// printf("a[%d][%d]:%d\n",x,y,a[x][y]);
if ( a[x][y] == 1 ) res++;
else break;
if (res>=4) {
flag = true;
break;
}
}
if ( flag ) break;
x = tmp.x; y = tmp.y;
while( !flag ){
y++;
if (y>10) break;
if (a[x][y] == 1) res++;
else break;
if (res>=4){
flag = true;
break;
}
}
//printf("%d\n",res);
if ( flag ) break;
x = tmp.x; y = tmp.y;
res = 0;
while( !flag ){
x--;
if (x < 1 ) break;
if ( a[x][y] == 1 ) res++;
else break;
if (res>=4) {
flag = true;
break;
}
}
if ( flag ) break;
x = tmp.x; y = tmp.y;
while( !flag ){
x++;
if (x>10) break;
if (a[x][y] == 1) res++;
else break;
if (res>=4){
flag = true;
break;
}
}
if ( flag ) break;
x = tmp.x; y = tmp.y;
res = 0;
while( !flag ){
x--;
y--;
if ( x <1 || y <1) break;
if (a[x][y] == 1) res++;
else break;
if (res>=4){
flag = true;
break;
}
}
if ( flag ) break;
x = tmp.x; y = tmp.y;
while( !flag ){
x++;
y++;
if ( x >10 || y >10) break;
if (a[x][y] == 1) res++;
else break;
if (res>=4){
flag = true;
break;
}
}
if ( flag ) break;
x = tmp.x; y = tmp.y;
res = 0;
while( !flag ){
x--;
y++;
if ( x <1 || y >10) break;
if (a[x][y] == 1) res++;
else break;
if (res>=4){
flag = true;
break;
}
}
if ( flag ) break;
x = tmp.x; y = tmp.y;
while( !flag ){
x++;
y--;
if ( x >10 || y <1) break;
if (a[x][y] == 1) res++;
else break;
if (res>=4){
flag = true;
break;
}
}
}
if( flag ) printf("YES\n");
else printf("NO\n");
return 0;
}