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;
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。