【每日一题】 UVA - 1589 Xiangqi 函数+模拟 wa了两天

时间:2023-03-10 03:45:49
【每日一题】 UVA - 1589 Xiangqi 函数+模拟  wa了两天

题意:背景就是象棋,

题解:坑点1(wa的第一天):将军可以吃掉相邻的棋子,(然行列也写反了orz)

  坑点2(wa的第二天):将军到马要反过来写,边界有误,并且第一次碰到的车才算(写到后来都忘了)

#define _CRT_SECURE_NO_WARNINGS
#include<cmath>
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cstring>
using namespace std;
#define rep(i,t,n) for(int i =(t);i<=(n);++i)
#define per(i,n,t) for(int i =(n);i>=(t);--i)
#define mmm(a,b) memset(a,b,sizeof(a)) const int maxn = 1e3 + ;
int a[maxn];
typedef long long ll;
int dr = ;
int n, sr, sc; double z;
char mmp[][]; int dir[][] = { , ,,, ,-, -, };
bool check(int r, int c) {
if (r < || r> || c < || c>)return ;
int nothas = ;
if (mmp[r][c])nothas == ;
//up
int nr = r, nc = c; int one = ,first = ;
while (nr--&&nr>=) {
if (first&&mmp[nr][nc] == 'R')return ; if (one&&mmp[nr][nc] == 'C')return ; if (mmp[nr][nc] != )if (first == )one = ,first=; else one = ; }
//down
nr = r, nc = c; one = ; first = ;
while (nr++&&nr <= ) {
if (first&&(mmp[nr][nc] == 'R' || mmp[nr][nc] == 'G'))return ; if (one&&mmp[nr][nc] == 'C')return ; if (mmp[nr][nc] != )if (first == )one = , first = ; else one = ;
}
//left
nr = r, nc = c; one = ; first = ;
while (nc++&&nc <= ) {
if (first&&mmp[nr][nc] == 'R')return ; if (one&&mmp[nr][nc] == 'C')return ; if (mmp[nr][nc] != )if (first == )one = , first = ; else one = ;
}
//right
nr = r, nc = c; one = ; first = ;
while (nc--&&nc >= ) {
if (first&&mmp[nr][nc] == 'R')return ; if (one&&mmp[nr][nc] == 'C')return ; if (mmp[nr][nc] != )if (first == )one = , first = ; else one = ; }
//horse
nr = r, nc = c;
if (mmp[nr + ][nc+] == ) {if (mmp[nr + ][nc + ] == 'H' || mmp[nr + ][nc + ] == 'H')return ;}
if (mmp[nr + ][nc - ] == ) { if (mmp[nr + ][nc - ] == 'H' || mmp[nr + ][nc - ] == 'H')return ; }
if (nr>=&&mmp[nr-][nc+] == ) { if (mmp[nr-][nc + ] == 'H' || (nr>=&&mmp[nr-][nc + ] == 'H'))return ; }
if (nr >= && mmp[nr - ][nc - ] == ) { if (mmp[nr - ][nc - ] == 'H' || (nr >= && mmp[nr - ][nc - ] == 'H'))return ; } return ;
}
int main() { while (cin >> n >> sr >> sc && (n || sr || sc)) {
mmm(mmp, ); rep(i, , n) {
char c;
cin >> c;
int x, y;
cin >> x >> y;
mmp[x][y] = c; }
int cnt = ;
rep(i, , ) {
if (check(sr + dir[i][], sc + dir[i][])) cnt++;
}
if (cnt == )puts("YES");
else puts("NO");
} }
/*
2 3 5
H 2 5
C 1 5 3 1 5
H 4 5
G 10 5
C 7 5 2 1 5
R 4 4
G 10 5 3 1 5
G 10 4
R 5 5
H 3 7 4 1 5
G 10 4
C 6 5
H 5 5
R 1 1 5 1 5
G 10 4
C 6 5
H 5 5
H 4 5
R 1 1 3 1 5
G 10 4
C 2 7
H 3 7 3 1 5
G 10 4
R 5 5
R 1 6 4 1 5
G 10 4
R 5 5
R 1 6
H 3 7 0 0 0 */

第一天的wa

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<stdio.h>
#include<algorithm>
#include<set>
#include<bitset>
#include<queue>
using namespace std; #define rep(i,j,k) for(int i = (int)j;i <= (int)k;i ++)
#define per(i,j,k) for(int i = (int)j;i >= (int)k;i --)
#define debug(x) cerr<<#x<<" = "<<(x)<<endl
#define mmm(a,b) memset(a,b,sizeof(a))
#define pb push_back
#define eps 1e-7 typedef long long ll;
const int maxn = 1e6 + ;
//const ll mod = 1e9 + 7;
int mmp[][];
int n = ;
int dir[][] = { , ,,, ,-, -, };
struct node {
int x, y, t;
node(int x = , int y = , int t = ) :x(x), y(y), t(t) {}
void sc() { scanf("%d%d", &x, &y); }
}; int vis[][];
string op[];
int r[], c[];
int main()
{
int sr, sc;
begin:
while (cin >> n>>sr>>sc&&(n||sr||sc)) { mmm(mmp, );
mmm(vis, );
rep(i, , n) {
//string op; int r, c;
cin >> op[i] >> r[i] >> c[i];
vis[r[i]][c[i]] = ;
}
rep(k, , n) {
if (op[k] == "R") {
int i = r[k];
int ok = ;
while (i--) {
if (vis[i][c[k]] )ok = ;
if (ok)mmp[i][c[k]] = ;
}
i = r[k];
ok = ;
while (i++&i<=) {
if (vis[i][c[k]] )ok = ;
if (ok)mmp[i][c[k]] = ;
}
int j = c[k];
ok = ;
while (j--) {
if (vis[r[k]][j] && ok == )ok = ;
if (ok)mmp[r[k]][j] = ;
}
j = c[k];
ok = ;
while (j++&&j<=) {
if (vis[r[k]][j] && ok == )ok = ;
if (ok)mmp[r[k]][j] = ;
}
//rep(i, 1, 10)mmp[i][c[k]] = 1;
//rep(j, 1, 9)mmp[r[k]][j] = 1;
}
if (op[k] == "G") {
per(i, , ) { if (vis[i][c[k]])break; if (i == sr && sc == c[k]) { puts("NO"); goto begin; } mmp[i][c[k]] = ; } }
if (op[k] == "C") {
int i = r[k];
int ok = ;
while (i--) {
if (vis[i][c[k]]) if( ok == )ok = ;
else ok = ; if (ok)mmp[i][c[k]] = ;
}
i = r[k];
ok = ;
while (i++&&i<=) {
if (vis[i][c[k]]) if (ok == )ok = ;
else ok = ; if (ok)mmp[i][c[k]] = ;
}
int j = c[k];
ok = ;
while (j--) {
if (vis[r[k]][j])if(ok == )ok = ;
else ok = ; if (ok)mmp[r[k]][j] = ;
}
while (j++) {
if (vis[r[k]][j]) if( ok == )ok = ;
else ok = ; if (ok)mmp[r[k]][j] = ;
}
}
if (op[k] == "H") {
if (c[k] + <= )if (!vis[r[k]][c[k] + ])mmp[r[k] + ][c[k] + ] = mmp[r[k] - ][c[k] + ] = ;
if (c[k] - <= )if (!vis[r[k]][c[k] - ])mmp[r[k] + ][c[k] - ] = mmp[r[k] - ][c[k] - ] = ;
if (r[k] - <= )if (!vis[r[k]-][c[k]])mmp[r[k] - ][c[k] - ] = mmp[r[k] - ][c[k] +] = ;
if (r[k] + <= )if (!vis[r[k] + ][c[k]])mmp[r[k] + ][c[k] - ] = mmp[r[k] + ][c[k] + ] = ;
}
}
int ok=;
rep(i, , ) {
int dr = sr + dir[i][];
int dc = sc + dir[i][];
if (dr > || dr < || dc> || dc < )continue;
if (mmp[dr][dc] == )ok = ;
}
rep(i, , ) {rep(j, , )cout << mmp[i][j] << ' ';cout << endl;}
if (ok)puts("NO");
else puts("YES");
} }
/* 2 2 5
H 2 3
R 2 4 */