uva1589象棋

来源:互联网 发布:央视网络电视打不开 编辑:程序博客网 时间:2024/04/28 21:54

背景:这道题战线拉得最久,每次一到写这道题的时候都有事,导致我写了4天,调试了三个上午,wrong得我想哭,最后历时15个多小时,我终于ac了。

错因:这道题主要是有很多种情况,要考虑完所有的情况,得需要自己无限出数据。

思路:我的思路是用两个字符型数组模拟整个棋盘,一个模拟那个残局,一个模拟红方的棋子能到达的地方,即使帅模拟的地方有些是不符合象棋规则的,但是把帅当成车来用的话,在关键的地方是不会出错误的,所以我就把帅和车写成了一个函数。具体代码如下:

#include <stdio.h>#include <string.h>#include <iostream>using namespace std;char cb[12][10],ab[12][10];void RG(int a,int b){    int c;    for(c=a-1;c>=1;c--)    {        ab[c][b]='S';        if(cb[c][b]!='A'&&cb[c][b]!='B') break;    }    for(c=a+1;c<=3;c++)    {        ab[c][b]='S';        if(cb[c][b]!='A'&&cb[c][b]!='B') break;    }    for(c=b+1;c<=9;c++)    {        ab[a][c]='S';        if(cb[a][c]!='A'&&cb[a][c]!='B') break;    }    for(c=b-1;c>=1;c--)    {        ab[a][c]='S';        if(cb[a][c]!='A'&&cb[a][c]!='B') break;    }}void H(int a,int b){    if(cb[a][b+1]=='A'&&b+2<=9&&a-1>=1)  ab[a-1][b+2]='S';    if(cb[a][b+1]=='A'&&b+2<=9&&a+1<11)  ab[a+1][b+2]='S';    if(cb[a][b-1]=='A'&&b-2>=1&&a-1>=1)  ab[a-1][b-2]='S';    if(cb[a][b-1]=='A'&&b-2>=1&&a+1<11)  ab[a+1][b-2]='S';    if(cb[a+1][b]=='A'&&b-1>=1&&a+2<11)  ab[a+2][b-1]='S';    if(cb[a+1][b]=='A'&&b+1<=9&&a+2<11)  ab[a+2][b+1]='S';    if(cb[a-1][b]=='A'&&b-1>=1&&a-2>=1)  ab[a-2][b-1]='S';    if(cb[a-1][b]=='A'&&b+1<=9&&a-2>=1)  ab[a-2][b+1]='S';}void C(int a,int b){    if(b>=4&&b<=6&&a==1)        if(cb[2][b]!='A'&&cb[2][b]!='B') ab[3][b]='S';    int c,d;    for(c=a-1;c>=1;c--)    {        if(cb[c][b]=='B') return;        if(cb[c][b]!='A') break;    }    for(d=c-1;d>=1;d--)    {        ab[d][b]='S';        if(cb[d][b]!='A'&&cb[d][b]!='B') break;    }    for(c=b+1;c<=9;c++)    {        if(cb[a][c]=='B') return;        if(cb[a][c]!='A') break;    }    for(d=c+1;d<=9;d++)    {        ab[a][d]='S';        if(cb[a][d]!='A'&&cb[a][d]!='B') break;    }    for(c=b-1;c>=1;c--)    {        if(cb[a][c]=='B') return;        if(cb[a][c]!='A') break;    }    for(d=c-1;d>=1;d--)    {        ab[a][d]='S';        if(cb[a][d]!='A'&&cb[a][d]!='B') break;    }}int judge(int i,int j){    int ok=1;    if(i+1<4&&ab[i+1][j]!='S') ok=0;    if(i-1>0&&ab[i-1][j]!='S') ok=0;    if(j+1<7&&ab[i][j+1]!='S') ok=0;    if(j-1>3&&ab[i][j-1]!='S') ok=0;    return ok;}int main(void){    int n,i,j,Ch[8][3],a1,b1;    while(cin>>n>>a1>>b1&&n&&a1&&b1)    {        memset(cb,'A',sizeof(cb));        memset(ab,'A',sizeof(ab));        memset(Ch,0,sizeof(Ch));cb[a1][b1]='B';        char ch;        for(int k=0;k<n;k++)        {            cin>>ch>>i>>j;            cb[i][j]=ch;            Ch[k][0]=i;Ch[k][1]=j;        }        for(int m=0;m<n;m++)        {            int a=Ch[m][0],b=Ch[m][1];            if(cb[a][b]=='R'||cb[a][b]=='G') RG(a,b);            else if(cb[a][b]=='H') H(a,b);            else if(cb[a][b]=='C') C(a,b);        }        puts(judge(a1,b1)?"YES":"NO");    }    return 0;}





3 0
原创粉丝点击