题目链接如下:
Online Judge
这道题目卡了我很久很久……所有能搜到的测试数据都没问题,跟其他人算法比较逻辑也没问题,但一直WA,都无奈了……最后幸亏看到这篇博文,UVa 1589 da模拟!!_uva1589的测试数据_羁绊残阳的博客-CSDN博客
提醒了我UVA数据的变态....原先我用getchar(); 然后scanf("%c")的形式输入象棋的名字,但这样是不行的!我猜,UVA的数据有些可能不止一个换行,也就是不能用scanf char的格式来输入(除非再加判断是否字母),要么std::cin, 要么输入字符串然后取首字符。
我的代码如下:
#include
#include
#include
// #define debug
const int RR = 11;
const int CC = 10;
struct piece{
char name;
int row;
int col;
};
int n, u, v;
char board[RR][CC];
std::vector vec;
int hrow[] = {-2, -1, 1, 2, 2, 1, -1, -2};
int hcol[] = {1, 2, 2, 1, -1, -2, -2, -1};
int hbrow[] = {-1, 0, 0, 1, 1, 0, 0, -1};
int hbcol[] = {0, 1, 1, 0, 0, -1, -1, 0};
int calmiddle(int s, int t, piece k){
if(k.row != s && k.col != t){
return 100;
}
int nbr = 0;
if(k.row == s){
int a = std::min(k.col, t);
int b = std::max(k.col, t);
for(int i = a + 1; i < b; ++i){
if(board[s][i] != ' '){
nbr++;
}
}
}
if(k.col == t){
int a = std::min(k.row, s);
int b = std::max(k.row, s);
for(int i = a + 1; i < b; ++i){
if(board[i][t] != ' '){
nbr++;
}
}
}
return nbr;
}
bool caseFly(int s, int t){
for(int i = 0; i < n; ++i){
if(vec[i].name == 'G' && vec[i].col == t && !calmiddle(s, t, vec[i])){
return true;
}
}
return false;
}
bool judge(int s, int t, piece k){
if(k.row == s && k.col == t){
return false;
}
if(k.name == 'G'){
if(k.col != t || calmiddle(s, t, k) > 0){
return false;
}
}
if(k.name == 'R'){
if((k.row != s && k.col != t) || calmiddle(s, t, k) > 0){
return false;
}
}
if(k.name == 'C'){
if((k.row != s && k.col != t) || calmiddle(s, t, k) != 1){
return false;
}
}
if(k.name == 'H'){
for(int i = 0; i < 8; ++i){
if(k.row + hrow[i] == s && k.col + hcol[i] == t && board[k.row + hbrow[i]][k.col + hbcol[i]] == ' '){
return true;
}
}
return false;
}
return true;
}
bool caseLeft(int s, int t){ // can excape
if(t < 4){
return false;
}
for(int i = 0; i < n; ++i){
if(judge(s, t, vec[i])){
return false;
}
}
return true;
}
bool caseRight(int s, int t){
if(t > 6){
return false;
}
for(int i = 0; i < n; ++i){
if(judge(s, t, vec[i])){
return false;
}
}
return true;
}
bool caseAbove(int s, int t){
if(s == 0 || s == 7){
return false;
}
for(int i = 0; i < n; ++i){
if(judge(s, t, vec[i])){
return false;
}
}
return true;
}
bool caseBelow(int s, int t){
if(s == 4 || s == 11){
return false;
}
for(int i = 0; i < n; ++i){
if(judge(s, t, vec[i])){
return false;
}
}
return true;
}
int main(){
#ifdef debug
freopen("0.txt","r",stdin);
freopen("2.txt","w",stdout);
#endif
while(scanf("%d %d %d", &n, &u, &v) == 3 && n && u){
vec.resize(n);
std::fill(board[0], board[0] + RR * CC, ' ');
char str[3];
for(int i = 0; i < n; ++i){
scanf("%s %d %d", str, &vec[i].row, &vec[i].col);
vec[i].name = str[0];
board[vec[i].row][vec[i].col] = vec[i].name;
}
if(caseFly(u, v) || caseLeft(u, v - 1) || caseRight(u, v + 1) || caseAbove(u - 1, v) || caseBelow(u + 1, v)){
printf("NO\n");
} else{
printf("YES\n");
}
}
#ifdef debug
fclose(stdin);
fclose(stdout);
#endif
return 0;
}