1589象棋(大模拟)

题意:黑棋只有一个“将”,红棋有“马”,“炮”,“车”,“帅”中的几种,问黑棋是否没有被红棋将军。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#define repu(i,a,b) for(int i=a;i<b;i++)
#define mem(a) memset(a,0,sizeof(a))
using namespace std;
char graph[12][12],ch[3];
int nx,ny;
int go[8][2] = {{1,0},{0,1},{-1,0},{0,-1},{1,1},{-1,-1},{1,-1},{-1,1}};
int inBlackPalace(int x,int y)
{
    if(x>=1&&x<=3&&y>=4&&y<=6)
        return 1;
    return 0;
}
int goG(int x,int y)
{
    int a,b;
    if(y==ny)
    {
        if(x>nx)
            a=nx,b=x;
        else
            a=x,b=nx;
        repu(i,a,b)
        if(graph[i][y])///帅与将之间有间隔
            return 0;
        return 1;///被帅将军
    }
    return 0;
}
int goH(int x,int y)///蹩马腿
{
    ///与马能构成“日”字
    if(abs(nx-x)==2&&abs(ny-y)==1)
    {
        if(graph[(nx+x)/2][y])
            return 0;
        return 2;///被马将军
    }
    if(abs(ny-y)==2&&abs(nx-x)==1)
    {
        if(graph[x][(ny+y)/2])
            return 0;
        return 2;///被马将军
    }
    return 0;
}
int goR(int x,int y)
{
    int a,b;
    if(x==nx)
    {
        if(y>ny)
            a=ny,b=y;
        else
            a=y,b=ny;
        repu(i,a,b)
        if(graph[x][i])
            return 0;
        return 3;///被车将军
    }
    if(y==ny)
    {
        if(x>nx)
            a=nx,b=x;
        else
            a=x,b=nx;
        repu(i,a,b)
        if(graph[i][y])
            return 0;
        return 3;///被车将军
    }
    return 0;
}
int goC(int x,int y)
{
    int sum = 0,a,b;
    if(x==nx&&y>ny)
    {
        repu(i,y,ny)
        {
            if(graph[x][i])
                sum++;
        }
        if(sum==1)
            return 4;///被炮将军
        return 0;
    }
    if(y==ny)
    {
        if(x>nx)
            a=nx,b=x;
        else
            a=x,b=nx;
        repu(i,a,b)
        {
            if(graph[i][y])
                sum++;
        }
        if(sum==1)
            return 4;
        return 0;
    }
    return 0;
}
int goo(int x, int y)
{
    //  printf("%d-%d\n",nx,ny);
    switch(graph[x][y])
    {
    case ‘G‘:
        return goG(x,y);
    case ‘R‘:
        return goR(x,y);
    case ‘H‘:
        return goH(x,y);
    case ‘C‘:
        return goC(x,y);
    }
    return false;
}
int main()
{
    int n;
    while (scanf("%d", &n) != EOF)
    {
        int bx, by,temp = false,o = 0;
        scanf("%d%d", &bx, &by);
        if (n == 0 && bx == 0 && by == 0) break;

        memset(graph, 0, sizeof(graph));

        for (int i = 0; i < n; i++)
        {
            int x, y;
            scanf("%s%d%d", ch, &x, &y);
            graph[x][y] = ch[0];
        }
        if((bx==1&&by==4)||(bx==1&&by==6)||(bx==3&&by==4)||(bx==3&&by==6))
            o = 8;
        else
            o = 4;
        for (int way = 0; way < o; way++)
        {
            nx = bx + go[way][0];
            ny = by + go[way][1];
            if (!inBlackPalace(nx, ny))
                continue;
            char tep = graph[nx][ny];
            graph[nx][ny] = 0;
            //  printf("way is--%d\n",way);
            int ok = 1;
            for (int i = 1; i <= 10; i++)
            {
                for (int j = 1; j <= 9; j++)
                {
                    if(graph[i][j])
                    {
                        // printf("%d-%d:%c\n",i,j,graph[i][j]);
                        if(goo(i,j))///将军成功了,再换条路
                        {
                            ok =0;
                            break;
                        }
                    }
                }
                if(ok==0)
                    break;
            }
            //  printf("****\n");
            graph[nx][ny] = tep;
            if(ok)///此路可以不被将军
            {
                temp = true;
                break;
            }
        }
        if(temp)
            puts("NO");
        else
            puts("YES");
    }
    return 0;
}
时间: 2024-11-18 02:15:39

1589象棋(大模拟)的相关文章

AC日记——神奇的幻方 洛谷 P2615(大模拟)

题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. 之后,按如下方式从小到大依次填写每个数K(K=2,3,…,N*N): 1.若(K−1)在第一行但不在最后一列,则将K填在最后一行,(K−1)所在列的右一列: 2.若(K−1)在最后一列但不在第一行,则将K填在第一列,(K−1)所在行的上一行: 3.若(K−1)在第一行最后一列,则将K填在(K−1)

URAL 1715. Another Ball Killer (大模拟)

1715. Another Ball Killer Time limit: 2.0 second Memory limit: 64 MB Contestants often wonder what jury members do during a contest. Someone thinks that they spend all the contest fixing bugs in tests. Others say that the jury members watch the conte

POJ 1835 大模拟

宇航员 #include<iostream> #include<cstdio> #include<string> #include<cstring> #define maxn 10010 using namespace std; int a[7],temp[7]; char str[10]; void solve(int str2[],int str3[]) { if(strcmp(str,"forward")==0)//方向不变 { s

大模拟祭

考试的前一天晚上我还在和$letong$说,我以后晚上再颓就去打模拟,然后就考了个大模拟 我比较$sb$,各种情况全分开了,没怎么压行,打了$1000$行整,$30$多$k$,妈妈再也不怕我打不出来猪国杀了 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 int n,len,Std; 6 int b[5]; 7 char s[20],ss[20];

hdu4121 象棋checkmate模拟

http://acm.hdu.edu.cn/showproblem.php?pid=4121 几百年前就做过这道题了,没想到坑到这个地步了..... 很简单,就是判断一个黑先手的局面是否checkmate(黑必败局,红必胜终局) 随便秀一下写程序之前的草稿 /*1.黑先红后 2.黑无论,红有胜 3.两种棋子,帅马将 车炮帅 4.检查棋盘合法性 不跃出棋盘 5.独立合法 范围 路径 终点 数组走法路径: 帅将有范围 马的不蹩脚 红的终点不红 飞行路径: 四方扫 红的终点不同红 帅车遇到红-1/+1

UVA-1589 象棋(模拟)

题目:(传送门) 给出一个象棋的残局,下一步是黑棋走,判断黑棋是不是被将死. 思路: 读完这个题,知道是一个模拟题,然后想到用两个二维数组来模拟棋盘,一个(mp数组)用来存残局,一个(res数组)用来处理红棋在棋盘上产生的对黑棋的限制. 将红棋的马.车.炮.将写成函数来分别处理.这样处理完之后,判断一下黑棋的四周是不是有可以走的格子,有的话不是将死,没有的是就是被将死了. 1.可以将车和将写成一个函数来处理,这里可以标记与棋子处于同一行和同一列中的格子,如下图: 红色圈出来的部分不能走,注意马上

poj--2706--Connect(极限大模拟)

Connect Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1148   Accepted: 375 Description Figure 1 Figure 2 Figure 3a Figure 3b Figure 4 Your task is to decide if a specified sequence of moves in the board game Twixt ends with a winning m

2017&quot;百度之星&quot;程序设计大赛 - 复赛1001&amp;&amp;HDU 6144 Arithmetic of Bomb【java大模拟】

Arithmetic of Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 129    Accepted Submission(s): 94 Problem Description 众所周知,度度熊非常喜欢数字. 它最近在学习小学算术,第一次发现这个世界上居然存在两位数,三位数……甚至N位数! 但是这回的算术题可并不简单,由于

UVALive 4222 /HDU 2961 Dance 大模拟

Dance Problem Description For a dance to be proper in the Altered Culture of Machinema, it must abide by the following rules: 1. A dip can only appear 1 or 2 steps after a jiggle, or before a twirl, as in:* ...jiggle dip...* ...jiggle stomp dip...* .