poj 4001 Xiangqi 模拟 顺带关于模拟的一番吐槽
很多人都觉得模拟题很恶心,各种长代码。但其实我觉得模拟题是最有美感的一类题,求同存异在模拟中表现的淋漓尽致。
遇到模拟题,不应急于下笔,应首先分析问题共性,抽象出相同的模型。代码尽量重用。
其次寻找stl中合适的数据结构,实在没有再进行手写。因为模拟题范围一般不大,stl完全可以接受,而且完全面向对象的想法非常适合模拟各种行为
最后再按模块编码,实现目标。
模拟的过程应该是很简约,具有美感高度抽象的,而绝非杂乱无章,各种复制粘贴的
/*
author:jxy
lang:C/C++
university:China,Xidian University
**If you need to reprint,please indicate the source**
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
char org[11][10];
const int x[4]={1,0,-1,0};
const int y[4]={0,1,0,-1};
bool killed(int X,int Y)
{
bool nemp;
int i;
int tx,ty,xx,yy;
for(i=0;i<4;i++)
{
tx=X+x[i];ty=Y+y[i];
nemp=false;
if(x[i]) //判断马
{
xx=tx+x[i];
if((org[tx][ty-1]==0&&org[xx][ty-1]=='H')||(org[tx][ty+1]==0&&org[xx][ty+1]=='H'))return 1;
}
else
{
yy=ty+y[i];
if((org[tx-1][ty]==0&&org[tx-1][yy]=='H')||(org[tx+1][ty]==0&&org[tx+1][yy]=='H'))return 1;
}
while(tx>=1&&tx<=10&&ty>=1&&ty<=9) //判断单向
{
if((!nemp&&(org[tx][ty]=='R'||org[tx][ty]=='G'))||(nemp&&org[tx][ty]=='C'))return 1;
if(org[tx][ty]!=0)
{
if(nemp)break;
nemp=true;
}
tx+=x[i]; ty+=y[i];
}
}
return 0;
}
int main()
{
int n,X,Y;
while(~scanf("%d%d%d",&n,&X,&Y)&&n+X+Y)
{
int i,tx,ty;
char c;
memset(org,0,sizeof(org));
for(i=0;i<n;i++)
{
scanf(" %c%d%d",&c,&tx,&ty);
org[tx][ty]=c;
}
bool ok=false;
for(i=0;i<4;i++)
{
tx=X+x[i];ty=Y+y[i];
if(tx<1||tx>3||ty<4||ty>6)continue;
if(killed(tx,ty)==0)ok=true;
}
printf("%s\n",ok?"NO":"YES");
}
}
最后更新:2017-04-03 14:53:52