站点图标 陌路寒暄

A编程题--马走日

A编程题--马走日

时间: 1ms        内存:128M

描述:

小平最近迷上了下象棋,尤其对棋子马的规则很有兴趣。马走动的方法是一直一斜,即先横着或竖着走一格,然后再斜着走一个对角线,俗称 " 马走日 " ,如图1所示。但是如果在马要去的方向正前方有别的棋子挡住,马就无法走过去,俗称 " 蹩马腿 ",如图2所示。象棋高手大盛给小平画了一张马行走的方法如图3所示,如果A有棋子,则马不能走到位置1和位置2;如果B有棋子,则马不能走到位置3和位置4;如果C有棋子,则马不能走到位置5和位置6;如果D有棋子,则马不能走到位置7和位置8。如果1至8是己方的棋子,马也不能走;如果是敌方棋子,则马可以走到对方的位置并吃掉对方;如果敌方是将或帅,则称为“将军”,如图4所示。

         

                 图1 马走日                                                      图2 蹩马腿     

                 

                    图3 蹩马腿                                                  图4 将军     

  

                      图5棋子存储     

棋子存储的坐标按照图5给出,如红方马的坐标为(2 , 6),黑方将的坐标为(9 , 4)

//可以参考的代码如下,主函数已给定,不需要提交,其它代码可自由编写。

#include <iostream>
#include <cmath>
#include <string>
using namespace std;
class ChessPoint
{
public:
 ChessPoint(int row=-1, int col=-1){SetPoint(row,col);}
 ChessPoint(const ChessPoint &src);
 ChessPoint& operator=(const ChessPoint &src){ SetPoint(src.Getrow(),src.Getcol());return *this;}
 bool operator==(const ChessPoint &src) const { return (src.Getrow() == Getrow() && src.Getcol() == Getcol()); }
 void Setrow(int row){this->row=row;}
 void Setcol(int col){this->col=col;}
 void SetPoint(int row, int col){Setrow(row);Setcol(col);}
 int Getrow() const {return row;}
 int Getcol() const {return col;}
private:
 int row,col;
};
class ChessBoard
{
public:
    ChessBoard(){num=0;}
    void AddPiece(int row,int col,string role,string name);  //增加一个棋子
    bool RedMaCanCheck(int row,int col);//红方马(row,col) 是否对黑方存在将军
private:
    int num;    //目前棋子数量
    ChessPoint point[32]; //棋子坐标
    string role[32];    //红方或黑方
    string name[32];    //棋子名称
};
void ChessBoard::AddPiece(int row,int col,string role,string name)
{
    point[num]=ChessPoint(row,col);
    this->role[num]=role;
    this->name[num]=name;
    num++;
}
int main()
{
    ChessBoard CB;
    int n,row,col;
    string role,name;
    cin>>n;
    while(n--)
    {
        cin>>row>>col>>role>>name;
        CB.AddPiece(row,col,role,name);
    }
    cin>>row>>col;
    if(CB.RedMaCanCheck(row,col))
        cout<<"Yes"<<endl;
    else
        cout<<"No"<<endl;
    return 0;
}

输入:

n个棋子和n棋子的信息(位置,标识),红方马的坐标。

输出:

当前红方马对敌方是否存在“将军”?是输出 "Yes" 否则输出 "No"

示例输入:

5
9 4 黑 将
7 7 黑 炮
6 4 黑 卒
3 4 红 兵
1 3 红 帅
2 6

示例输出:

No

提示:

参考答案(内存最优[1504]):

#include <iostream>
#include <cmath>
#include <string>
using namespace std;
class ChessPoint
{
public:
 ChessPoint(int row=-1, int col=-1){SetPoint(row,col);}
 ChessPoint(const ChessPoint &src);
 ChessPoint& operator=(const ChessPoint &src){ SetPoint(src.Getrow(),src.Getcol());return *this;}
 bool operator==(const ChessPoint &src) const { return (src.Getrow() == Getrow() && src.Getcol() == Getcol()); }
 void Setrow(int row){this->row=row;}
 void Setcol(int col){this->col=col;}
 void SetPoint(int row, int col){Setrow(row);Setcol(col);}
 int Getrow() const {return row;}
 int Getcol() const {return col;}
private:
 int row,col;
};
class ChessBoard
{
public:
    ChessBoard(){num=0;}
    void AddPiece(int row,int col,string role,string name);  //增加一个棋子
    bool RedMaCanCheck(int row,int col);//红方马(row,col) 是否对黑方存在将军
private:
    int num;    //目前棋子数量
    ChessPoint point[32]; //棋子坐标
    string role[32];    //红方或黑方
    string name[32];    //棋子名称
};
void ChessBoard::AddPiece(int row,int col,string role,string name)
{
    point[num]=ChessPoint(row,col);
    this->role[num]=role;
    this->name[num]=name;
    num++;
}

bool ChessBoard::RedMaCanCheck(int row,int col){
int jx,jy,cun=0;
for(int i=0;i<num;i++)
{if(name[i]=="将"&&role[i]=="黑")
{


jx=point[i].Getrow();
jy=point[i].Getcol();
    cun=1;
}
}
if(cun==0||jx==row||col==jy)
return 0;
int sum=0;
if(jx>row)sum+=jx-row;
else sum+=row-jx;
if(jy>col)sum+=jy-col;
else sum+=col-jy;
if(sum!=3)return 0;
char s;


if(jx>row)
{
    if(jy>col){
        if(jx-row==2)s='c';
            else s='b';
    }
    else{
        if(jx-row==2)s='c';
            else s='d';
    }
}
else{
    if(jy>col){
        if(row-jx==2)s='a';
            else s='b';
    }
    else{
        if(row-jx==2)s='a';
            else s='d';
    }
}
int n=num;

jx=row;jy=col;
if(s=='a'){
    for(int i=0;i<n;i++)
        if(jx-1==point[i].Getrow()&&jy==point[i].Getcol())
        return 0;
}
if(s=='b'){
    for(int i=0;i<n;i++)
        if(jx==point[i].Getrow()&&jy+1==point[i].Getcol())
        return 0;
}
if(s=='c'){
    for(int i=0;i<n;i++)
        if(jx+1==point[i].Getrow()&&jy==point[i].Getcol())
        return 0;
}
if(s=='d'){
    for(int i=0;i<n;i++)
        if(jx==point[i].Getrow()&&jy-1==point[i].Getcol())
        return 0;
}

return 1;
}
int main()
{
    ChessBoard CB;
    int n,row,col;
    string role,name;
    cin>>n;
    while(n--)
    {
        cin>>row>>col>>role>>name;
        CB.AddPiece(row,col,role,name);
    }
    cin>>row>>col;
    if(CB.RedMaCanCheck(row,col))
        cout<<"Yes"<<endl;
    else
        cout<<"No"<<endl;
    return 0;
}

参考答案(时间最优[0]):

#include <iostream>
#include <cmath>
#include <string>
using namespace std;
class ChessPoint
{
public:
 ChessPoint(int row=-1, int col=-1){SetPoint(row,col);}
 ChessPoint(const ChessPoint &src);
 ChessPoint& operator=(const ChessPoint &src){ SetPoint(src.Getrow(),src.Getcol());return *this;}
 bool operator==(const ChessPoint &src) const { return (src.Getrow() == Getrow() && src.Getcol() == Getcol()); }
 void Setrow(int row){this->row=row;}
 void Setcol(int col){this->col=col;}
 void SetPoint(int row, int col){Setrow(row);Setcol(col);}
 int Getrow() const {return row;}
 int Getcol() const {return col;}
private:
 int row,col;
};
class ChessBoard
{
public:
    ChessBoard(){num=0;}
    void AddPiece(int row,int col,string role,string name);  //增加一个棋子
    bool RedMaCanCheck(int row,int col);//红方马(row,col) 是否对黑方存在将军
private:
    int num;    //目前棋子数量
    ChessPoint point[32]; //棋子坐标
    string role[32];    //红方或黑方
    string name[32];    //棋子名称
};
void ChessBoard::AddPiece(int row,int col,string role,string name)
{
    point[num]=ChessPoint(row,col);
    this->role[num]=role;
    this->name[num]=name;
    num++;
}

bool ChessBoard::RedMaCanCheck(int row,int col){
int jx,jy,cun=0;
for(int i=0;i<num;i++)
{if(name[i]=="将"&&role[i]=="黑")
{


jx=point[i].Getrow();
jy=point[i].Getcol();
    cun=1;
}
}
if(cun==0||jx==row||col==jy)
return 0;
int sum=0;
if(jx>row)sum+=jx-row;
else sum+=row-jx;
if(jy>col)sum+=jy-col;
else sum+=col-jy;
if(sum!=3)return 0;
char s;


if(jx>row)
{
    if(jy>col){
        if(jx-row==2)s='c';
            else s='b';
    }
    else{
        if(jx-row==2)s='c';
            else s='d';
    }
}
else{
    if(jy>col){
        if(row-jx==2)s='a';
            else s='b';
    }
    else{
        if(row-jx==2)s='a';
            else s='d';
    }
}
int n=num;

jx=row;jy=col;
if(s=='a'){
    for(int i=0;i<n;i++)
        if(jx-1==point[i].Getrow()&&jy==point[i].Getcol())
        return 0;
}
if(s=='b'){
    for(int i=0;i<n;i++)
        if(jx==point[i].Getrow()&&jy+1==point[i].Getcol())
        return 0;
}
if(s=='c'){
    for(int i=0;i<n;i++)
        if(jx+1==point[i].Getrow()&&jy==point[i].Getcol())
        return 0;
}
if(s=='d'){
    for(int i=0;i<n;i++)
        if(jx==point[i].Getrow()&&jy-1==point[i].Getcol())
        return 0;
}

return 1;
}
int main()
{
    ChessBoard CB;
    int n,row,col;
    string role,name;
    cin>>n;
    while(n--)
    {
        cin>>row>>col>>role>>name;
        CB.AddPiece(row,col,role,name);
    }
    cin>>row>>col;
    if(CB.RedMaCanCheck(row,col))
        cout<<"Yes"<<endl;
    else
        cout<<"No"<<endl;
    return 0;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

退出移动版