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");
    }
}



目录
相关文章
|
6月前
|
机器人
【每日一题Day270】LC874模拟行走机器人 | 哈希表+模拟
【每日一题Day270】LC874模拟行走机器人 | 哈希表+模拟
47 0
|
5月前
|
存储 算法 数据挖掘
【模拟面试问答】力扣165题:比较版本号(逐个比较与双指针法详解及模拟面试问答)
【模拟面试问答】力扣165题:比较版本号(逐个比较与双指针法详解及模拟面试问答)
|
存储 机器人 C++
leetcode 每日一题 874. 模拟行走机器人 c++模拟解法
简单来说就是机器人在一个矩阵上移动 我们要找到一个离原点的一个最大欧式距离的平方
131 0
|
6月前
(模拟)L1-019. 谁先倒(2016)
(模拟)L1-019. 谁先倒(2016)
46 1
poj 1068 模拟
大概题意就是告诉你有个n个小括号,每一个“)”左边有多少个“(”都告诉你了,然后让你求出每一对括号之间有多少对括号(包含自己本身)。 思路: 我先计算每个“)”左边有多少个“(”要匹配,然后每遇到一个“)”,然后向前寻找第一个可以匹配的“(”,找到后将其数量减一,这样的话在寻找的过程中经过了几个“)”就表示这对括号里面有多少括号。
25 0
|
存储 算法 C++
数据结构与算法——第四节 栈和队列(C 模拟实现+思路分析+运行截图)
对于栈和队列,我们在这里只是把 其底层的原理简单的说一下,等到C++说到STL的时候,我们还会详细地说。
193 0
数据结构与算法——第四节 栈和队列(C 模拟实现+思路分析+运行截图)
|
算法
递归模拟演示--栈--《数据结构与算法》
递归模拟演示--栈--《数据结构与算法》
102 0
|
机器学习/深度学习 算法
【刷穿 LeetCode】检测「环形数组是否存在循环」的三种方式:「朴素模拟」&「遍历标记(含优化)」
【刷穿 LeetCode】检测「环形数组是否存在循环」的三种方式:「朴素模拟」&「遍历标记(含优化)」
斗地主案例思路分析及代码实现
斗地主案例需求分析及代码实现 /* 斗地主综合案例: 1.准备牌 2.洗牌 3.发牌 4.看牌 */ import java.util.ArrayList; import java.util.Collections; public class DouDiZhu { public static voi
斗地主案例思路分析及代码实现