【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;
}
【UVA】1589 Xiangqi(挖坑待填)的更多相关文章
- Uva - 1589 - Xiangqi
Xiangqi is one of the most popular two-player board games in China. The game represents a battle bet ...
- ●UVa 1589 Xiangqi(模拟)
●赘述题意 给出一个中国象棋残局,告诉各个棋子的位置,黑方只有1枚“将”,红方有至少2枚,至多7枚棋子,包含1枚“帅G”,和若干枚“车R”,“马H”,“炮C”.当前为黑方的回合,问黑方的“将”能否在移 ...
- 【每日一题】 UVA - 1589 Xiangqi 函数+模拟 wa了两天
题意:背景就是象棋, 题解:坑点1(wa的第一天):将军可以吃掉相邻的棋子,(然行列也写反了orz) 坑点2(wa的第二天):将军到马要反过来写,边界有误,并且第一次碰到的车才算(写到后来都忘了) # ...
- UVA 1589:Xiangqi (模拟 Grade D)
题目: 象棋,黑棋只有将,红棋有帅车马炮.问是否死将. 思路: 对方将四个方向走一步,看看会不会被吃. 代码: 很难看……WA了很多发,还越界等等. #include <cstdio> # ...
- [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 ...
- uva 1589 by sixleaves
坑爹的模拟题目.自己对于这种比较复杂点得模拟题的能力概述还不够,还多加练习.贴别是做得时候一直再想如何检查车中间有没有棋子,炮中间有没有棋子.到网上参考别人的代码才发先这么简单的办法,自己尽然想不到. ...
- Windows环境下写Linux sh脚本的一次挖坑和填坑
最近在研究Docker集群和安装的时候,需要准备若干台机器.所以我为节约时间,打算批量复制VM机器,然后用sh脚本命令执行机器名称和IP等基础配置信息的修改. 具体操作:我在windows环境下,用N ...
- UVA 1589 象棋
题意: 给出一个黑方的将, 然后 红方有 2 ~ 7 个棋子, 给出摆放位置,问是否已经把黑将将死, 红方已经将军. 分析: 分情况处理, 车 马 炮, 红将情况跟车是一样的. 建一个数组board保 ...
- 【2018寒假集训 Day2】【动态规划】垃圾陷阱(挖坑等填,未完成)
垃圾陷阱 (well) 卡门--农夫约翰极其珍视的一条Holsteins奶牛--已经落了到"垃圾井"中."垃圾井"是农夫们扔垃圾的地方,它的深度为D (2 &l ...
随机推荐
- 【PL/SQL编程】条件语句
1. if...then语句 if <condition_expression> then plsql_sentence; end if; declare -- Local variabl ...
- Java对多线程的支持
Java运行时系统实现了一个用于调度线程执行的线程调度器,用于确定某一时刻由哪一个线程在CPU上运行. 在Java技术中,线程通常是抢占式的而不需要时间片分配进程(分配给每个线程相等的CPU时间的进程 ...
- Java跨平台的原理--java跨平台是通过JVM实现的
孙鑫视频---笔记(1-3) java跨平台是通过JVM(java 虚拟机)实现的. Java应用程序的开发周期: 编译.下载.解释.执行. 1.java源文件的编译过程 java编译程序将java源 ...
- FFmpeg再学习 -- SDL 环境搭建和视频显示
继续看雷霄骅的 课程资料 - 基于FFmpeg+SDL的视频播放器的制作 一.SDL 简介 参看:WIKI -- Simple DirectMedia Layer 参看:最简单的视音频播放示例9:SD ...
- C# OPC UA服务器 OPC UA网关 三菱 西门子 欧姆龙 Modbus转OPC UA 服务器 可配置的OPC UA服务器网关 HslSharp软件文档
前言 本文将使用一个基于开源项目HslCommunication创建的OPC UA网关,方便通过配置创建一个OPC UA的网关中心.具体的操作及支持的设备信息项目参照下面: 开源项目HslCommun ...
- BDD测试框架Spock概要
前言 为了找到一个适合自己的.更具操作性的.以DDD为核心的开发方法,我最近一直在摸索如何揉合BDD与DDD.围绕这个目标,我找到了Impact Mapping → Cucumber → Spock ...
- excel中多表汇总
excel中将多个表中的结果汇总到一张表格里,而且汇总表格的数据是随着其它表格的数据变化面变化 其实就是函数sumif的使用,sumif函数的结构: sumif函数语法 sumif(range,cri ...
- 一些Fibonacci数列的神奇性质【数学】
递推式: \(f_i=1 (1\leq i\leq 2)\) \(f_i=f_{i-1}+f_{i-2}(i>2)\) 一些性质 \(\sum_{i=1}^n f_i=f_{n+2}-1\) \ ...
- HDU3047 Zjnu Stadium 【带权并查集】
HDU3047 Zjnu Stadium Problem Description In 12th Zhejiang College Students Games 2007, there was a n ...
- Java调用函数传递参数到底是值传递还是引用传递
今天翻看微信上有关Java技术的公众号时,看到了一篇关于Java中值传递的问题,文章讨论了在Java中调用函数进行传参的时候到底是值传递还是引用传递这个面试时会问到的问题.之前也接触过类似的问题,但只 ...