hdu4121 Xiangqi && uva1589 Xiangqi (模拟)

来源:互联网 发布:无间道刘建明知乎 编辑:程序博客网 时间:2024/05/18 13:44

这题去年uva做过,做的我差点把电脑砸了。。。

现在虽然比那时强点,但还是花了不少时间。

一看见代码长的就不敢打有木有?我已经尽量少用数组下标了,不然代码一片混乱,长代码恐惧症有木有?


进入正题,马最好处理,条件对角线就好。车和炮都需要判断4个方向,而且攻击范围遇到一个子就停止,相对炮要麻烦点。帅就是车的垂直简化版(我还是有一点象棋基础的哦呵呵~,然而并没有什么卵用)。细节处理了好久,题目上的样例可以了就交,果断WA。后来从别人那里找了点测试数据,原来是炮和马的问题。刚开始我是边输入棋子边处理,可是这样就会发现假如炮可以憋马腿,但炮在马之后输入,这样就无法判断。不得已只好用结构体(噗),先存起来再判断,好在数据量不大。。。


现在看看这200多行的代码,依旧渗人。少壮不努力,老大做模拟啊。。。要不是现在做出来了,我估计又把电脑砸了鄙视

#include <stdio.h>#include <algorithm>#include <iostream>#include <queue>#include <cmath>#include <ctype.h>#include <string.h>using namespace std;const int N = 20000;const int INF = 1000000;char vis[11][10];//表示放过子的地方char Map0[11][10]; //表示可以走的地方int flag;struct node{    int x0, y0;    char chess[5];}f[15];char Map[11][10] = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},                    {0, 0, 0, 0, 1, 1, 1, 0, 0, 0},                    {0, 0, 0, 0, 1, 1, 1, 0, 0, 0},                    {0, 0, 0, 0, 1, 1, 1, 0, 0, 0},                    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},                    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},                    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},                    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},                    {0, 0, 0, 0, 1, 1, 1, 0, 0, 0},                    {0, 0, 0, 0, 1, 1, 1, 0, 0, 0},                    {0, 0, 0, 0, 1, 1, 1, 0, 0, 0}};void R(int x, int y){    for(int i = x + 1; i <= 11; i ++)    {        int flag = 1;        Map0[i][y] = 0;        if(vis[i][y])        {            flag = 0;        }        if(flag == 0) break;    }    for(int i = x - 1; i >= 0; i --)    {        int flag = 1;        Map0[i][y] = 0;        if(vis[i][y])        {            flag = 0;        }        if(flag == 0) break;    }    for(int i = y + 1; i <= 10; i ++)    {        int flag = 1;        Map0[x][i] = 0;        if(vis[x][i])        {            flag = 0;        }        if(flag == 0) break;    }    for(int i = y - 1; i >= 0; i --)    {        int flag = 1;        Map0[x][i] = 0;        if(vis[x][i])        {            flag = 0;        }        if(flag == 0) break;    }}void H(int x, int y) //没问题{    if(!vis[x + 1][y])    {        Map0[x + 2][y + 1] = Map0[x + 2][y - 1] = 0;    }    if(!vis[x - 1][y])    {        Map0[x - 2][y + 1] = Map0[x - 2][y - 1] = 0;    }    if(!vis[x][y + 1])    {        Map0[x + 1][y + 2] = Map0[x - 1][y + 2] = 0;    }    if(!vis[x][y - 1])    {        Map0[x + 1][y - 2] = Map0[x - 1][y - 2] = 0;    }}void C(int x, int y)//ok{    for(int i = x + 1; i <= 11; i ++)    {        int flag = 1;        if(vis[i][y])        {            for(int j = i + 1; j <= 11; j ++)            {                Map0[j][y] = 0;                if(vis[j][y])                {                    flag = 0;                    break;                }            }        }        if(flag == 0) break;    }    for(int i = x - 1; i >= 0; i --)//ok    {        int flag = 1;        if(vis[i][y])        {            for(int j = i - 1; j >= 0; j --)            {                Map0[j][y] = 0;                if(vis[j][y])                {                    flag = 0;                    break;                }            }        }        if(flag == 0) break;    }    for(int i = y + 1; i <= 10; i ++)    {        int flag = 1;        if(vis[x][i])        {            for(int j = i + 1; j <= 10; j ++)            {                Map0[x][j] = 0;                if(vis[x][j])                {                    flag = 0;                    break;                }            }        }        if(flag == 0) break;    }    for(int i = y - 1; i >= 0; i --)    {        int flag = 1;        if(vis[x][i])        {            for(int j = i - 1; j >= 0; j --)            {                Map0[x][j] = 0;                if(vis[x][j])                {                    flag = 0;                    break;                }            }        }        if(flag == 0) break;    }}void G(int x, int y){    for(int i = x + 1; i <= 11; i ++)    {        int flag = 1;        Map0[i][y] = 0;        if(vis[i][y])        {            flag = 0;        }        if(flag == 0) break;    }    for(int i = x - 1; i >= 0; i --)    {        int flag = 1;        Map0[i][y] = 0;        if(vis[i][y])        {            flag = 0;        }        if(flag == 0) break;    }}int main(){   // freopen("in.txt", "r", stdin); //   freopen("out.txt", "w", stdout);    int n, x, y;    char ord[10];    while(~scanf("%d%d%d", &n, &x, &y) && n && x && y)    {        memset(Map0, 0, sizeof(Map0));        for(int i = 0; i <= 11; i ++)        {            for(int j = 0; j <= 10; j ++)            {                Map0[i][j] = Map[i][j];            }        }        memset(vis, 0, sizeof(vis));        int k = 0;        for(int i = 0; i < n; i ++)        {            cin >> f[i].chess;            scanf("%d%d", &f[i].x0, &f[i].y0);            vis[f[i].x0][f[i].y0] = 1; //           ord[k ++] = f[i].chess[0];        }        for(int i = 0; i < n; i ++)        {            if(f[i].chess[0] == 'R')            {                R(f[i].x0, f[i].y0);            }            else if(f[i].chess[0] == 'H')            {                H(f[i].x0, f[i].y0);            }            else if(f[i].chess[0] == 'C')            {                C(f[i].x0, f[i].y0);            }            else if(f[i].chess[0] == 'G')            {                G(f[i].x0, f[i].y0);            }        }   /*     for(int i = 0; i <= 10; i ++)        {            for(int j = 0; j <= 9; j ++)            {                printf("%d ", Map0[i][j]);            }            printf("\n");        }        printf("\n");*/        if(Map0[x + 1][y] == 0 && Map0[x - 1][y] == 0 && Map0[x][y + 1] == 0 && Map0[x][y - 1] == 0) printf("YES\n");        else printf("NO\n");  //      printf("\n");    }    return 0;}


0 0
原创粉丝点击