【UVA】1589 Xiangqi(挖坑待填)

题目

题目
?



?

分析

无力了,noip考完心力憔悴,想随便切道题却码了250line,而且还是错的,知道自己哪里错了,但特殊情况判起来太烦了,唯一选择是重构,我却没有这勇气。
有空再写吧,最近真的快疯了。
?



?

代码

对拍

#include <bits/stdc++.h>
int main()
{
    for(int i=1;i<=100;i++){
        system("rand.exe > in.txt");
        system("1589.exe < in.txt > 1.txt");
        system("std.exe < in.txt > 2.txt");
        if(system("fc 1.txt 2.txt")){
            printf("WA\n\n\n");
            system("pause");
            break;
        }
        else printf("AC\n\n\n");
    }
    return 0;
}

随机数


#include <bits/stdc++.h>
char s[20]="CHR";
int a[100][100];
bool iout(int x,int y){
    if(x<=4&&x>=1&&y>=3&&y<=7) return false;
    return true;
}
int main()
{
    srand(time(NULL));
    int t=rand()%35+3;
    while(t--){
        memset(a,0,sizeof(a));
        int n=rand()%5+3,x=1+rand()%3,y=4+rand()%3;
        printf("%d %d %d\n",n,x,y);
        a[x][y]=1;
        for(int i=1;i<=n-1;i++){
            int m=rand()%3,x=rand()%10+1,y=rand()%9+1;
            if(!a[x][y])
            printf("%c %d %d\n",s[m],x,y),a[x][y]=1;
            else i--;
        }
    l1: int x1=rand()%3+8,y1=rand()%3+4;
        if(!a[x1][y1])
        printf("G %d %d\n\n",x1,y1);
        else goto l1;
    }
    return 0;
}

自己的WA代码

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
struct node{
    int x,y;
    char s[10];
}a[100];
int n,map[30][30];
bool up,down,left,right,g;
bool in9(int x,int y){
    if(x>=1&&x<=3&&y>=4&&y<=6) return true;
    return false;
}
bool in(int x,int y){
    if(x>=1&&x<=10&&y>=1&&y<=9) return true;
    return false;
}
int get(int x,int y){
    if(x-1==a[0].x&&y==a[0].y) return 1;//上面
    if(x==a[0].x&&y-1==a[0].y) return 4;//右面
    if(x+1==a[0].x&&y==a[0].y) return 3;//下面
    if(x==a[0].x&&y+1==a[0].y) return 2;//左面
    return 0;
}
bool nothob(int x,int y,int an,int bn){
    for(int i=1;i<=n;i++){
        if(a[i].x==x+an && a[i].y==y+bn) return false;
    }
    return true;
}
void jump(int k)//跳马
{
    int x=a[k].x,y=a[k].y;
    if(in(x+2,y+1)){
        int m=get(x+2,y+1),p=1,q=0;
        if(nothob(x,y,p,q)&&m){
            if(m==1)down=false;if(m==2)left=false;
            if(m==3)up=false;if(m==4)right=false;
        }
    }
    if(in(x-2,y-1)){
        int m=get(x-2,y-1),p=-1,q=0;
        if(nothob(x,y,p,q)&&m){
            if(m==1)down=false;if(m==2)left=false;
            if(m==3)up=false;if(m==4)right=false;
        }
    }
    if(in(x+2,y-1)){
        int m=get(x+2,y-1),p=1,q=0;
        if(nothob(x,y,p,q)&&m){
            if(m==1)down=false;if(m==2)left=false;
            if(m==3)up=false;if(m==4)right=false;
        }
    }
    if(in(x-2,y+1)){
        int m=get(x-2,y+1),p=-1,q=0;
        if(nothob(x,y,p,q)&&m){
            if(m==1)down=false;if(m==2)left=false;
            if(m==3)up=false;if(m==4)right=false;
        }
    }
    if(in(x-1,y+2)){
        int m=get(x-1,y+2),p=0,q=1;
        if(nothob(x,y,p,q)&&m){
            if(m==1)down=false;if(m==2)left=false;
            if(m==3)up=false;if(m==4)right=false;
        }
    }
    if(in(x-1,y-2)){
        int m=get(x-1,y-2),p=0,q=-1;
        if(nothob(x,y,p,q)&&m){
            if(m==1)down=false;if(m==2)left=false;
            if(m==3)up=false;if(m==4)right=false;
        }
    }
    if(in(x+1,y+2)){
        int m=get(x+1,y+2),p=0,q=1;
        if(nothob(x,y,p,q)&&m){
            if(m==1)down=false;if(m==2)left=false;
            if(m==3)up=false;if(m==4)right=false;
        }
    }
    if(in(x+1,y-2)){
        int m=get(x+1,y-2),p=0,q=-1;
        if(nothob(x,y,p,q)&&m){
            if(m==1)down=false;if(m==2)left=false;
            if(m==3)up=false;if(m==4)right=false;
        }
    }
    return;
}
bool empty1(int k){
    for(int i=1;i<=n;i++){
        if(a[i].y==a[k].y&&(a[i].x>min(a[0].x,a[k].x)&&a[i].x<max(a[0].x,a[k].x)))
    //  if(abs(a[i].x-a[0].x)!=1)
         return false;
    }
    return true;
}
bool empty2(int k){
    for(int i=1;i<=n;i++){
        if(a[i].x==a[k].x&&(a[i].y>min(a[0].y,a[k].y)&&(a[i].y<max(a[0].y,a[k].y))))
    //  if(abs(a[i].y-a[0].y)!=1)
        return false;
    }
    return true;
}
void check(int k){
    if(a[k].s[0]=='R'){ //车
        if(a[k].y==a[0].y&&(a[k].x-a[0].x)==1&&in9(a[k].x,a[k].y)) up=false;
        if(a[k].x==a[0].x&&(a[k].y-a[0].y)==1&&in9(a[k].x,a[k].y)) left=false;
        if(a[k].y==a[0].y&&(a[k].x-a[0].x)==-1&&in9(a[k].x,a[k].y)) down=false;
        if(a[k].x==a[0].x&&(a[k].y-a[0].y)==-1&&in9(a[k].x,a[k].y)) right=false;
        if(a[k].y-a[0].y==1&&empty1(k)) right=false;//,printf("!!!!!");
        if(a[0].y-a[k].y==1&&empty1(k)) left=false;//,printf("^^^^^");
        if(a[k].x-a[0].x==1&&empty2(k)) down=false;
        if(a[0].x-a[k].x==1&&empty2(k)) up=false;
        int t1=0,t2=0,t1m=0,t2m=0;
        for(int i=1;i<=n;i++){
            if(a[i].x==a[k].x&&(a[i].y>min(a[0].y,a[k].y)&&(a[i].y<max(a[0].y,a[k].y)))){t1++;t1m=i;}
            if(a[i].y==a[k].y&&(a[i].x>min(a[0].x,a[k].x)&&(a[i].x<max(a[0].x,a[k].x)))){t2++;t2m=i;}
        }
        if(a[k].x==a[0].x&&(t1==0)) right=false,left=false;
        if((abs(a[t1m].y-a[0].y)==1&&t1==1)&&in9(a[t1m].x,a[t1m].y)) right=false,left=false;
        if(a[k].y==a[0].y&&(t2==0)) up=false,down=false;
        if(a[k].y==a[0].y&&a[t2m].x-a[0].x==1&&t2==1&&in9(a[t2m].x,a[t2m].y)) down=false;;
        if(a[k].y==a[0].y&&a[t2m].x-a[0].x==-1&&t2==1&&in9(a[t2m].x,a[t2m].y)) up=false;
        if(a[k].x==a[0].x&&a[t1m].y-a[0].y==1&&t1==1&&in9(a[t1m].x,a[t1m].y)) left=false;
        if(a[k].x==a[0].x&&a[t1m].y-a[0].y==-1&&t1==1&&in9(a[t1m].x,a[t1m].y)) right=false;
        //,printf("%d %d\n",t2,t2m);//,printf("########");
    //  printf("H - %d %d\n",t2,t2m);
    }
    if(a[k].s[0]=='G'){ //王
        int t1=0,t1m;
        for(int i=1;i<=n;i++){
            if(a[i].y==a[k].y&&a[i].x>min(a[0].x,a[k].x)&&a[i].x<max(a[0].x,a[k].x)){t1++;t1m=i;break;}
        }
    //  printf("G - %d %d",t1,t1m);
        if(a[k].y-a[0].y==1 &&t1==0) right=false;
        if(a[0].y-a[k].y==1 &&t1==0) left=false;
        if(a[k].y==a[0].y && t1==0) g=false,up=down=false;
        if(t1==1&&a[k].y==a[0].y&&a[t1m].x-a[0].x==1) down=false;
    }
    if(a[k].s[0]=='C'){ //炮
        if(a[k].y==a[0].y){
            int t1=0,t2=0,t1m=0,t2m=0;
        //  if(abs(a[k].x-a[0].x)==2) return;
            for(int i=1;i<=n;i++){
                if(i==k||a[i].y!=a[0].y) continue;
                if(a[i].x>a[0].x&&a[i].x<a[k].x) t1++,t1m=i;
                if(a[i].x<a[0].x&&a[i].x>a[k].x) t2++,t2m=i;
            }
        //  printf("---------%d %d  %d %d---------\n",t1,t1m,t2,t2m);
            if((t1==1||(t1==2&&abs(a[t1m].x-a[0].x)==1&&in9(a[t1m].x,a[t1m].y)))||(t2==1||(t2==2&&abs(a[t2m].x-a[0].x)==1&&in9(a[t2m].x,a[t2m].y))))
            if(!(t1==1&&abs(a[t1m].x-a[0].x)==1&&in9(a[t1m].x,a[t1m].y))||!(t2==1&&abs(a[t2m].x-a[0].x)==1&&in9(a[t2m].x,a[t2m].y)))
            up=false,down=false;
            if(t1==1&&abs(a[t1m].x-a[0].x)==1&&in9(a[t1m].x,a[t1m].y)) down=false;
        }
        if(a[k].x==a[0].x){
        //  if(abs(a[k].y-a[0].y)==2) return;
            int t1=0,t2=0,t1m=0,t2m=0;
            for(int i=1;i<=n;i++){
                if(i==k||a[i].x!=a[0].x) continue;
                if(a[i].y>a[0].y&&a[i].y<a[k].y) t1++,t1m=i;
                if(a[i].y<a[0].y&&a[i].y>a[k].y) t2++,t2m=i;
            }
    //      printf("---------%d %d  %d %d---------\n",t1,t1m,t2,t2m);
            if((t1==1||(t1==2&&abs(a[t1m].y-a[0].y)==1&&in9(a[t1m].x,a[t1m].y)))||(t2==1||(t2==2&&abs(a[t2m].y-a[0].y)==1&&in9(a[t2m].x,a[t2m].y))))
            if(!(t1==1&&abs(a[t1m].y-a[0].y)==1&&in9(a[t1m].x,a[t1m].y))||!(t2==1&&abs(a[t2m].y-a[0].y)==1&&in9(a[t2m].x,a[t2m].y)))
            left=false,right=false;
        }
        if(abs(a[k].x-a[0].x)==1){
        //  if(abs(a[k].y-a[0].y)==2) return;
            int t1=0,t2=0;
            for(int i=1;i<=n;i++){
                if(i==k||a[i].x!=a[k].x) continue;
                if(a[i].y>min(a[0].y,a[k].y)&&a[i].y<max(a[0].y,a[k].y)) t1++;
            }
            if(t1==1) if(a[k].x-a[0].x==1) down=false; else up=false;
        }
        if(abs(a[k].y-a[0].y)==1){
        //  if(abs(a[k].x-a[0].x)==2) return;
            int t1=0,t2=0;
            for(int i=1;i<=n;i++){
                if(i==k||a[i].y!=a[k].y) continue;
                if(a[i].x>min(a[0].x,a[k].x)&&a[i].x<max(a[0].x,a[k].x)) t1++;
            }
            if(t1==1) if(a[k].y-a[0].y==1) right=false; else left=false;
        }
    }
    if(a[k].s[0]=='H'){ //马
        jump(k);
    }
}
bool init(int x,int y){
    if(in9(x+1,y)) down=true;else down=false;
    if(in9(x-1,y)) up=true;else up=false;
    if(in9(x,y-1)) left=true;else left=false;
    if(in9(x,y+1)) right=true;else right=false;
}
bool check2(){
    int ax=0,x=a[0].x,y=a[0].y;
//  printf("check2 - (%d %d)",x,y);
    for(int i=x+1;i<=10;i++){
        if(map[i][y]=='R') if(ax==0) return false;
        if(map[i][y]=='C'&&ax==1) return false;
        if(map[i][y]!=0) ax++;
    }
    ax=0;
    for(int i=x-1;i>=1;i--){
        if(map[i][y]=='R') if(ax==0) return false;
        if(map[i][y]=='C'&&ax==1) return false;
        if(map[i][y]!=0) ax++;
    }
    ax=0;
    for(int i=y+1;i<=9;i++){
        if(map[x][i]=='R') if(ax==0) return false;
        if(map[x][i]=='C'&&ax==1) return false;
        if(map[x][i]!=0) ax++;
    }
    ax=0;
    for(int i=y-1;i>=1;i--){
        if(map[x][i]=='R') if(ax==0) return false;
        if(map[x][i]=='C'&&ax==1) return false;
        if(map[x][i]!=0) ax++;
    }
    if(map[x+2][y+1]=='H'&&map[x+1][y]==0) return false;
    if(map[x-2][y+1]=='H'&&map[x-1][y]==0) return false;
    if(map[x+2][y-1]=='H'&&map[x+1][y]==0) return false;
    if(map[x-2][y-1]=='H'&&map[x-1][y]==0) return false;
    if(map[x-1][y-2]=='H'&&map[x][y-1]==0) return false;
    if(map[x+1][y+2]=='H'&&map[x][y+1]==0) return false;
    if(map[x-1][y+2]=='H'&&map[x][y+1]==0) return false;
    if(map[x+1][y+2]=='H'&&map[x][y-1]==0) return false;
    return true;
}
int main()
{
    while(scanf("%d%d%d",&n,&a[0].x,&a[0].y)==3 && n!=0){
        init(a[0].x,a[0].y);memset(map,0,sizeof(map));
        g=true;int mark;
        for(int i=1;i<=n;i++){
            scanf("%s%d%d",a[i].s,&a[i].x,&a[i].y);
            map[a[i].x][a[i].y]=a[i].s[0];
            if(a[i].s[0]=='G') mark=i;
        }
    //  printf("BEGIN--Debug: up:%d down:%d left:%d right:%d\n\n\n",up,down,left,right);
        for(int i=1;i<=n;i++){
            if(!up&&!down&&!left&&!right) break;//小优化
    //      printf("Round:%d------------------\n",i);
            check(i);
    //      printf("%d :%s (%d,%d) Debug: g:%d up:%d down:%d left:%d right:%d\n\n\n",i,a[i].s,a[i].x,a[i].y,g,up,down,left,right);
        }
        a[0].x=a[mark].x;a[0].y=a[mark].y;
        int flag=0; //if(g==false) flag=1;
/*      if(!g&&!up&&!down&&!left&&!right){
            printf("Debug: g:%d up:%d down:%d left:%d right:%d\n\n\n",g,up,down,left,right);
            g=check2();if(g==true) flag=2;
        //  printf("Debug: g:%d up:%d down:%d left:%d right:%d\n\n\n",g,up,down,left,right);
        }//map[x][y]='B';*/
    /*  for(int i=1;i<=10;i++){
            for(int j=1;j<=9;j++) if(map[i][j]!=0) printf("%c ",map[i][j]);else printf("_ ");
            printf("\n");
        }*/
    //  printf("flag %d  g %d \n",flag,g);
        if(up||down||left||right||flag==2) printf("NO\n");
        else printf("YES\n");
    }
    return 0;
}
时间: 2024-08-17 01:51:53

【UVA】1589 Xiangqi(挖坑待填)的相关文章

UVA 1589 Xiangqi

Z1589 - Xiangqi Time limit: 3.000 seconds 做这题的时候WA了很多次. 解决思路是,枚举黑方将军可以移动的位置,接着判断这些位置是否被红方将军,如果所有位置会被红方吃掉,那么就是checkmate了. 要注意的情况可能就是双炮将军. 1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 5 char board[12][12]; 6 int dr[4] = { 1,

UVA - 1589 Xiangqi (模拟)

Xiangqi Problem Description Xiangqi is one of the most popular two-player board games in China. The game represents a battle between two armies with the goal of capturing the enemy's "general" piece. In this problem, you are given a situation of

UVa 1589 Xiangqi(模拟 HDU4121)

题意  给你一个黑方被将军的象棋残局  判断红方是否已经把黑方将死 模拟题  注意细节就行了  看黑方的将是否四个方向都不能走 #include<cstdio> #include<cstring> using namespace std; const int N = 12; char brd[N][N]; int dx[] = { -1, 1, 0, 0}, dy[] = {0, 0, -1, 1}; int hx[] = { -2, -1, -2, -1, 1, 2, 1, 2}

UVA 1589:Xiangqi (模拟 Grade D)

题目: 象棋,黑棋只有将,红棋有帅车马炮.问是否死将. 思路: 对方将四个方向走一步,看看会不会被吃. 代码: 很难看……WA了很多发,还越界等等. #include <cstdio> #include <cstring> #include <cstdlib> char graph[13][13]; int go[4][2] = {{1,0},{0,1},{-1,0},{0,-1}}; bool inBlackPalace(int x, int y) { return

UVA 1589 Xiangqi(仔细的模拟)

题意:中国象棋大家都玩过,就是基本规则,只有将,帅,车,马,炮. 解题思路: 思路是把各个棋子能攻击到的位置在judge数组相应的位置上标记出来 首先考虑马蹩马腿的情况,这个比较好考虑,注意不要越界就行了. 车,不能穿过自己方的车,马,炮,帅.但范围可以穿过'将',因为'将'下一步会移动. 炮,不可以用'将'作为炮架,其余都可以,因为'将'下一步会移动. 帅,情况很简单.一条线. 要注意的是,每个棋子的攻击范围,是必须到另一个棋子的位置的 考虑数据 3 1 5 R 1 1 R 2 5 G10 5

uva 10400 Game Show Math (填合适的运算符)

看到这种填合适的运算符之类的题目,第一感觉就是用dfs来枚举递归. 但邮箱道题目算法设计里面那么大的数据,想到有可能会超时. 用最直白的简单的方法dfs一遍后交上,超时. --需要判重和边界结束条件. 在所有能剪断的地方痛下狠手,狂加特判+return: 然后就炒鸡快了 #include<iostream> #include<cstring> #include<cstdio> #define ADD 32000 using namespace std; int arr[

传统行业转型微服务的挖坑与填坑

原文:传统行业转型微服务的挖坑与填坑 一.微服务落地是一个复杂问题,牵扯到IT架构,应用架构,组织架构多个方面 在多家传统行业的企业走访和落地了微服务之后,发现落地微服务是一个非常复杂的问题,甚至都不完全是技术问题. 当时想微服务既然是改造应用,做微服务治理,类似注册,发现,熔断,限流,降级等,当然应该从应用开发组切入,一般一开始聊的会比较开心,从单体架构,到SOA,再到微服务架构,从Dubbo聊到SpringCloud,但是必然会涉及到微服务的发布和运维问题,涉及到DevOps和容器层,这些都

Xiangqi UVA - 1589

https://vjudge.net/problem/UVA-1589 刘汝佳的第四章习题,思路没有难点,是用来练习函数化和自定而下的编程方法的. 首先分析输入输出,思考用什么容器存储数据,处理问题时会用到什么,然后写出大体框架. 可以简单的先写成接收输入,处理问题,按标准要求输出,然后把输入输出部分完善(因为本题这部分比较简单) 然后写处理部分,要判断当前情况下将死等于判断下一步所有能走的位置是不是都为死棋.(有一种特殊情况,直接可以飞将吃对方的帅来取胜?!!!) 再细化问题,把判断该位置是不

[A]1065 A+B and C (64bit)(挖坑待填)

Given three integers A, B and C in [-2^63, 2^63], you are supposed to tell whether A+B > C. Input Specification: The first line of the input gives the positive number of test cases, T (<=10). Then T test cases follow, each consists of a single line