您的位置:首页 > 其它

Xiangqi UVA - 1589

2018-01-28 13:40 537 查看






大致说一下意思,一个黑将,然后红方已经将军了,现在轮到黑棋走,问黑棋还有没有活路了。

心路历程:

1.1月26号凌晨开始琢磨的,拿到题写了五十行,走的是把3*3将可以走的格子标记的办法,当时感觉有点问题,后来考虑到吃子的情况,扔了睡觉。

2.好吧,我没睡着,两点多爬起来写了两句思路。

3.周六走了一天的亲戚,写的伪代码,基本确定走点的办法。

4.晚上开始写......,wa,本人比较懒,直接去DEBUG找的前人的小样。发现走炮有点问题,改了改,最后对上了(很长的那个),一脸兴奋提交,wa。

5.走马的时候有问题,改了改,RE。

6.RE无限连,搁一搁,做洪水题(4-10例题),qsort死活过不去,都方了,最后快排没办法了。

7.早上起来(十点多),把走马的程序扔了,直接往上交(确定RE),发现还是RE,看了一遍panduan函数,j写成i......

8.交上去还错,再找(wa了,一脸激动,好歹不RE......),把scanf改成了gets和sscanf,AC,(输入有空行)

9.菜,菜,菜,一道题干了三天。

好了,感谢听我说完这一堆废话,下面讲一下思路,确定五个点,将和它的上下左右,然后五个点直接扔进函数判断,马最后判断。具体就不罗嗦了,注释写的反正我找RE的时候看得挺懂的.......#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
int s[110][100];
char s1[110][100];
bool pdma(const int a,const int b)
{
if(a==1)
{
if(s[a+1][b-2] && s1[a+1][b-2]=='H' && !s[a+1][b-1])return 1;//左下
if(s[a+2][b-1] && s1[a+2][b-1]=='H' && !s[a+1][b-1])return 1;//下左
if(s[a+2][b+1] && s1[a+2][b+1]=='H' && !s[a+1][b+1])return 1;//下右
if(s[a+1][b+2] && s1[a+1][b+2]=='H' && !s[a+1][b+1])return 1;//右下
}
else if(a==2)
{
if(s[a+1][b-2] && s1[a+1][b-2]=='H' && !s[a+1][b-1])return 1;//左下
if(s[a+2][b-1] && s1[a+2][b-1]=='H' && !s[a+1][b-1])return 1;//下左
if(s[a+2][b+1] && s1[a+2][b+1]=='H' && !s[a+1][b+1])return 1;//下右
if(s[a+1][b+2] && s1[a+1][b+2]=='H' && !s[a+1][b+1])return 1;//右下
if(s[a-1][b-2] && s1[a-1][b-2]=='H' && !s[a-1][b-1])return 1;//左上
if(s[a-1][b+2] && s1[a-1][b+2]=='H' && !s[a-1][b+1])return 1;//右上
}
else if(a==3)
{
if(s[a+1][b-2] && s1[a+1][b-2]=='H' && !s[a+1][b-1])return 1;//左下
if(s[a+2][b-1] && s1[a+2][b-1]=='H' && !s[a+1][b-1])return 1;//下左
if(s[a+2][b+1] && s1[a+2][b+1]=='H' && !s[a+1][b+1])return 1;//下右
if(s[a+1][b+2] && s1[a+1][b+2]=='H' && !s[a+1][b+1])return 1;//右下
if(s[a-1][b-2] && s1[a-1][b-2]=='H' && !s[a-1][b-1])return 1;//左上
if(s[a-1][b+2] && s1[a-1][b+2]=='H' && !s[a-1][b+1])return 1;//右上
if(s[a-2][b-1] && s1[a-2][b-1]=='H' && !s[a-1][b-1])return 1;//上左
if(s[a-2][b+1] && s1[a-2][b+1]=='H' && !s[a-1][b+1])return 1;//上右
}
return 0;
}
bool panduan(const int a,const int b)
{
if(a==0||a>3||b<4||b>6)return 1;//不在3*3内
int i,j;
int flag=0;
for(i=b-1; i>0; i--) //左横
{
if(s[a][i]==1)
{
if(s1[a][i]=='R')
{
return 1;
}
flag=1;
break;
}
}
if(flag==1)
for(j=i-1; j>0; j--) //判断炮
{
if(s[a][j]==1){
if(s1[a][j] == 'C')
return 1;
else break;}
}

flag=0;
for(i=b+1; i<10; i++) //右横
{
if(s[a][i]==1)
{
if(s1[a][i]=='R')
{
return 1;
}
flag=1;
break;
}
}
if(flag==1)
for(j=i+1; j<10; j++) //判断炮
{
if(s[a][j]==1 ){
if(s1[a][j] == 'C')
return 1;
else break;
}
}

flag=0;
for(i=a-1; i>0; i--) //上竖
{
if(s[i][b]==1)
{
if(s1[i][b]=='R')
return 1;
flag=1;
break;
}
}
if(flag==1)//判断炮
for(j=i-1; j>0; j--)
{
if(s[j][b]==1 ){
if(s1[j][b] == 'C')
return 1;
else break;
}
}
flag=0;
for(i=a+1; i<11; i++) //下竖判断
{
if(s[i][b])
{
if(s1[i][b]=='R'||s1[i][b]=='G')
return 1;
flag=1;
break;
}
}
if(flag==1)
for(j=i+1; j<11; j++) //判断炮
{
if(s[j][b]){
if(s1[j][b]=='C')
return 1;
else break;
}
}
return pdma(a,b);
}
int main()
{
//freopen("in.txt","r",stdin);
int N,heicolumn,heirow;//判断五个位置
int x,y;
char c;
int djk;
char xyz[101];
while(scanf("%d %d %d",&N,&heicolumn,&heirow)==3)
{
if(!N)return 0;
memset(s,0,sizeof(s));
memset(s1,'\0',sizeof(s1));
getchar();
while(N--)
{
gets(xyz);
sscanf(xyz,"%c %d %d",&c,&x,&y);
//sscanf(xyz,"%c %d %d",&c,&x,&y);
s[x][y]=1;
s1[x][y]=c;
}
djk=0;
if(panduan(heicolumn,heirow) && panduan(heicolumn+1,heirow) && panduan(heicolumn-1,heirow) && panduan(heicolumn,heirow+1) && panduan(heicolumn,heirow-1))djk++;
//if(panduan(heicolumn+1,heirow) )djk++;
//if(panduan(heicolumn-1,heirow) )djk++;
//if(panduan(heicolumn,heirow+1) )djk++;
//if(panduan(heicolumn,heirow-1) )djk++;
if(djk)printf("YES\n");
else printf("NO\n");
}
return 0;
}
不要问我std是什么情况,RE乱投医/......
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva