zoukankan      html  css  js  c++  java
  • Solution -「THUPC 2019」Duckchess

    Description

    Link.

    大模拟是不可能给你概括题意的。

    Solution

    (据说鸭棋题解用这个标题很吉利)(这里是被点名批评的 长度 19k 的打法)(先说好代码里 Chinglish 满地,尽量不要吐槽吧……)


    首先我们不需要仔细阅读每一种棋的判定方法及其走法,写的时候照抄即可。

    理一下大体逻辑。首先开一个全局的棋盘 vector<vector<string> > evemap;,一个 over 表示棋局是否结束。

    然后是棋手的结构体:

    struct chess
    {
    	string color;
    	string getcolor(int x,int y);
    	string getchess(int x,int y);
    	bool outside(int x,int y);
    	bool exist(int x,int y);
    	bool thereok(int x,int y);
    	bool occaptain(int sx,int sy,int tx,int ty);
    	bool ocguard(int sx,int sy,int tx,int ty);
    	bool ocelephant(int sx,int sy,int tx,int ty);
    	bool ochorse(int sx,int sy,int tx,int ty);
    	bool occar(int sx,int sy,int tx,int ty);
    	bool ocduck(int sx,int sy,int tx,int ty);
    	bool ocsoldier(int sx,int sy,int tx,int ty);
    	string checkgoi();
    	bool checkove();
    	void moving(int sx,int sy,int tx,int ty);
    	string final(string s);
    	vector<string> movecaptain(int sx,int sy,int tx,int ty);
    	vector<string> moveguard(int sx,int sy,int tx,int ty);
    	vector<string> moveelephant(int sx,int sy,int tx,int ty);
    	vector<string> movehorse(int sx,int sy,int tx,int ty);
    	vector<string> movecar(int sx,int sy,int tx,int ty);
    	vector<string> moveduck(int sx,int sy,int tx,int ty);
    	vector<string> movesoldier(int sx,int sy,int tx,int ty);
    	vector<string> execute(int sx,int sy,int tx,int ty); 
    }redplay,blueplay;
    

    string color 表示棋手的颜色。

    这里先来解释一下各个函数的含义:

    • oc-chessmove-chess 形式:

      • bool oc-chess(sx,sy,tx,ty):这个表示 chess 棋从 ((s_{x},s_{y})) 走到 ((t_{x},t_{y})) 是否合法。
      • vector<string> move-chess(sx,sy,tx,ty):这个标识 chess 棋从 ((s_{x},s_{y})) 走到 ((t_{x},t_{y})) 最终返回的东西。
    • 其他的一些杂函数:

      • string getcolor(x,y):棋盘位置 ((x,y)) 的棋的颜色,如果没有则返回 empty
      • string getchess(x,y):棋盘位置 ((x,y)) 的棋的棋子类型,如果没有则返回 empty
      • bool outside(int x,int y)((x,y)) 是否出界。
      • bool exist(int x,int y)((x,y)) 是否存在任意一方的棋子。
      • bool thereok(int x,int y)((x,y)) 是否不存在同色棋子且没有出界。
      • string checkgoi():检查是否有将军。(通过遍历棋盘实现)
      • bool checkove():是否有任意一方的将军被吃。
      • void moving(int sx,int sy,int tx,int ty):把 ((s_{x},s_{y})) 的棋子移到 ((t_{x},t_{y}))
      • string final(string s):我棋盘存储棋子的形式是 color-chess,这个函数的作用就是转为题目的形式 color chess
      • void execute(sx,sy,tx,ty):处理一次询问。

    结构差不多就这里,接下来说一下具体实现。

    • 首先用个 void mapinitial() 初始化棋盘。
    • 然后都询问,处理询问,调用 execute()
    • 输出。

    好的我承认这个实现方法特别烂。

    /*
    function(vector<string>)(with prefix 'move') result:
    	"invcom": invalid command
    	"color-chess": the chess(opposite) which is eaten
    	"beaten": have the Jiangjun been complete
    	"over": have the game been over
    vector[0][1][2][3]
    */
    #include<queue>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int h=10,w=9;
    int over;
    //string evemap[20][20];
    vector<vector<string> > evemap;
    void printmap()
    {
    	for(int i=0;i<h;++i)
    	{
    		for(int j=0;j<w;++j)	printf("%14s",evemap[i][j].c_str()),printf("[%d %d]",i,j);
    		printf("
    ");
    	}
    }
    struct chess
    {
    	string color;
    	string getcolor(int x,int y)
    	/*
    		result:
    			"empty": empty place
    			"red": red chess
    			"blue": blue chess
    	*/
    	{
    		string res,s=evemap[x][y];
    		if(s=="empty")	return "empty";
    		else
    		{
    			for(int i=0;i<s.length();++i)
    			{
    				if(s[i]=='-')	break;
    				res+=s[i];
    			}
    			return res;
    		}
    	}
    	string getchess(int x,int y)
    	/*
    		result:
    			each string has the same meaning as 'evemap'
    	*/
    	{
    		string res,s=evemap[x][y];
    		if(s=="empty")	return "empty";
    		else
    		{
    			int st=0;
    			for(int i=0;i<s.length();++i)
    			{
    				if(st)	res+=s[i];
    				else if(s[i]=='-')	st=1;
    			}
    			return res;
    		}
    	}
    	bool outside(int x,int y)
    	{
    		if(x<0||x>=h||y<0||y>=w)	return 1;
    		else	return 0;
    	}
    	bool exist(int x,int y)
    	{
    		if(getchess(x,y)=="empty")	return 0;
    		else	return 1;
    	}
    	bool thereok(int x,int y)
    	/*
    		result:
    			1: this place is walkable
    			0: this place is occupied or (x,y) is out of range
    		means:
    			1. isn't out of range
    			2. (x,y) has no same color chess or is empty
    	*/
    	{
    		if(outside(x,y))	return 0;
    		else if(evemap[x][y]!="empty"&&getcolor(x,y)==color)	return 0;
    		else	return 1;
    	}
    	bool occaptain(int sx,int sy,int tx,int ty)
    	{
    		if(!thereok(tx,ty))	return 0;
    		for(int i=-1;i<=1;++i)
    		{
    			if(i)
    			{
    				if(thereok(sx+i,sy)&&tx==(sx+i)&&ty==sy)	return 1;
    				else if(thereok(sx,sy+i)&&tx==sx&&ty==(sy+i))	return 1;
    			}
    		}
    		return 0;
    	}
    	bool ocguard(int sx,int sy,int tx,int ty)
    	{
    		if(!thereok(tx,ty))	return 0;
    		for(int i=-1;i<=1;++i)
    		{
    			if(i)
    			{
    				if(thereok(sx+i,sy+i)&&tx==(sx+i)&&ty==(sy+i))	return 1;
    				if(thereok(sx+i,sy-i)&&tx==(sx+i)&&ty==(sy-i))	return 1;
    			}
    		}
    		return 0;
    	}
    	bool ocelephant(int sx,int sy,int tx,int ty)
    	{
    		if(!thereok(tx,ty))	return 0;
    		for(int i=-1;i<=1;++i)
    		{
    			if(i)
    			{
    				for(int j=-1;j<=1;++j)
    				{
    					if(j)
    					{
    						if(thereok(sx+i,sy+j))
    						{
    							if(thereok(sx+(i<<1),sy+(j<<1))&&tx==(sx+(i<<1))&&ty==(sy+(j<<1)))	return 1;
    						}
    					}
    				}
    			}
    		}
    		return 0;
    	}
    	bool ochorse(int sx,int sy,int tx,int ty)
    	{
    		if(!thereok(tx,ty))	return 0;
    		for(int i=-1;i<=1;++i)
    		{
    			if(i)
    			{
    				for(int j=-1;j<=1;++j)
    				{
    					if(j)
    					{
    //						printf("[{%d %d} {%d %d} {%d %d %d}]
    ",sx,sy+j,sx+i,sy+(j<<1),outside(sx,sy+j),exist(sx,sy+j),!outside(sx,sy+j)&&!exist(sx,sy+j));
    						if(!outside(sx+i,sy)&&!exist(sx+i,sy))
    						{
    							if(thereok(sx+(i<<1),sy+j)&&tx==(sx+(i<<1))&&ty==(sy+j))	return 1;
    						}
    						if(!outside(sx,sy+j)&&!exist(sx,sy+j))
    						{
    							if(thereok(sx+i,sy+(j<<1))&&tx==(sx+i)&&ty==(sy+(j<<1)))	return 1;
    						}
    					}
    				}
    			}
    		}
    		return 0;
    	}
    	bool occar(int sx,int sy,int tx,int ty)
    	{
    		if(!thereok(tx,ty))	return 0;
    		if(sx==tx)
    		{
    			int delta;
    			if(sy<ty)	delta=1;
    			else	delta=-1;
    			for(int j=sy;j^ty;j+=delta)
    			{
    				if((j^sy)&&exist(sx,j))	return 0;
    			}
    			return 1;
    		}
    		else if(sy==ty)
    		{
    			int delta;
    			if(sx<tx)	delta=1;
    			else	delta=-1;
    			for(int i=sx;i^tx;i+=delta)
    			{
    //				printf("[{%d %d}]
    ",i,sy);
    				if((i^sx)&&exist(i,sy))	return 0;
    			}
    			return 1;
    		}
    		else	return 0;
    	}
    	bool ocduck(int sx,int sy,int tx,int ty)
    	{
    		if(!thereok(tx,ty))	return 0;
    		for(int i=-1;i<=1;++i)
    		{
    			if(i)
    			{
    				for(int j=-1;j<=1;++j)
    				{
    					if(j)
    					{
    						if(!outside(sx+(i<<1),sy+j)&&!exist(sx+(i<<1),sy+j)&&!outside(sx+i,sy)&&!exist(sx+i,sy))
    						{
    //							printf("[{%d %d} {%d %d} {%d %d} {%d %d} {%d %d} {%d %d}]
    ",sx,sy,tx,ty,sx+i,sy,sx+(i<<1),sy+j,sx+((i<<1)+i),sy+(j<<1),thereok(sx+((i<<1)+i),sy+(j<<1)),tx==(sx+((i<<1)+i)&&ty==(sy+(j<<1))));
    							if(thereok(sx+((i<<1)+i),sy+(j<<1))&&tx==(sx+((i<<1)+i))&&ty==(sy+(j<<1)))	return 1;
    						}
    						if(!outside(sx+i,sy+(j<<1))&&!exist(sx+i,sy+(j<<1))&&!outside(sx,sy+j)&&!exist(sx,sy+j))
    						{
    							if(thereok(sx+(i<<1),sy+((j<<1)+j))&&tx==(sx+(i<<1))&&ty==(sy+((j<<1)+j)))	return 1;
    						}
    					}
    				}
    			}
    		}
    		return 0;
    	}
    	bool ocsoldier(int sx,int sy,int tx,int ty)
    	{
    		if(!thereok(tx,ty))	return 0;
    		for(int i=-1;i<=1;++i)
    		{
    			if(i)
    			{
    				if(thereok(sx+i,sy)&&tx==(sx+i)&&ty==sy)	return 1;
    				if(thereok(sx,sy+i)&&tx==sx&&ty==(sy+i))	return 1;
    				if(thereok(sx+i,sy+i)&&tx==(sx+i)&&ty==(sy+i))	return 1;
    				if(thereok(sx+i,sy-i)&&tx==(sx+i)&&ty==(sy-i))	return 1;
    			}
    		}
    		return 0;
    	}
    	string checkgoi()
    	/*
    		result:
    			"not": Jiangjun didn't happened
    			"red": the RED general has been Jiangjuned
    			"blue": the BLUE general has been Jiangjuned
    	*/
    	{
    		if(over)	return "not";
    		for(int i=0;i<h;++i)
    		{
    			for(int j=0;j<w;++j)
    			{
    				string curcol=getcolor(i,j),curche=getchess(i,j),revcol;
    				if(curcol=="red")	revcol="blue";
    				else if(curcol=="blue")	revcol="red";
    				else	revcol="empty";
    				if(curche!="empty")
    				{
    					if(curche=="captain")
    					{
    						for(int k=-1;k<=1;++k)
    						{
    							if(k)
    							{
    								if(!outside(i+k,j))
    								{
    									string nxtcol=getcolor(i+k,j),nxtche=getchess(i+k,j);
    									if(nxtcol==revcol&&nxtche=="captain")	return nxtcol;
    								}
    								if(!outside(i,j+k))
    								{
    									string nxtcol=getcolor(i,j+k),nxtche=getchess(i,j+k);
    									if(nxtcol==revcol&&nxtche=="captain")	return nxtcol;
    								}
    							}
    						}
    					}
    					else if(curche=="guard")
    					{
    						for(int k=-1;k<=1;++k)
    						{
    							if(k)
    							{
    								if(!outside(i+k,j+k))
    								{
    									string nxtcol=getcolor(i+k,j+k),nxtche=getchess(i+k,j+k);
    									if(nxtcol==revcol&&nxtche=="captain")	return nxtcol;
    								}
    								if(!outside(i+k,j-k))
    								{
    									string nxtcol=getcolor(i+k,j-k),nxtche=getchess(i+k,j-k);
    									if(nxtcol==revcol&&nxtche=="captain")	return nxtcol;
    								}
    							}
    						}
    					}
    					else if(curche=="elephant")
    					{
    						for(int k=-1;k<=1;++k)
    						{
    							if(k)
    							{
    								for(int l=-1;l<=1;++l)
    								{
    									if(l)
    									{
    										if(!outside(i+(k<<1),j+(l<<1))&&!exist(i+k,j+l))
    										{
    											string nxtcol=getcolor(i+(k<<1),j+(l<<1)),nxtche=getchess(i+(k<<1),j+(l<<1));
    											if(nxtcol==revcol&&nxtche=="captain")	return nxtcol; 
    										}
    									}
    								}
    							}
    						}
    					}
    					else if(curche=="horse")
    					{
    						for(int k=-1;k<=1;++k)
    						{
    							if(k)
    							{
    								for(int l=-1;l<=1;++l)
    								{
    									if(l)
    									{
    										if(!outside(i+(k<<1),j+l)&&!exist(i+k,j))
    										{
    											string nxtcol=getcolor(i+(k<<1),j+l),nxtche=getchess(i+(k<<1),j+l);
    											if(nxtcol==revcol&&nxtche=="captain")	return nxtcol;
    										}
    										if(!outside(i+k,j+(l<<1))&&!exist(i,j+l))
    										{
    											string nxtcol=getcolor(i+k,j+(l<<1)),nxtche=getchess(i+k,j+(l<<1));
    											if(nxtcol==revcol&&nxtche=="captain")	return nxtcol;
    										}
    									}
    								}
    							}
    						}
    					}
    					else if(curche=="car")
    					{
    						for(int k=i;k<h;++k)
    						{
    							if(!outside(k,j))
    							{
    								string nxtcol=getcolor(k,j),nxtche=getchess(k,j);
    								if(nxtche!="empty")
    								{
    									if(nxtche=="captain")	return nxtcol;
    									break;
    								}
    							}
    						}
    						for(int l=j;l<w;++l)
    						{
    							if(!outside(i,l))
    							{
    								string nxtcol=getcolor(i,l),nxtche=getchess(i,l);
    								if(nxtche!="empty")
    								{
    									if(nxtche=="captain")	return nxtcol;
    									break;
    								}
    							}
    						}
    					}
    					else if(curche=="duck")
    					{
    						for(int k=-1;k<=1;++k)
    						{
    							if(k)
    							{
    								for(int l=-1;l<=1;++l)
    								{
    									if(l)
    									{
    										if(!outside(i+((k<<1)+k),j+(l<<1))&&!exist(i+(k<<1),j+l)&&!exist(i+k,j))
    										{
    											string nxtcol=getcolor(i+((k<<1)+k),j+(l<<1)),nxtche=getchess(i+((k<<1)+k),j+(l<<1));
    											if(nxtcol==revcol&&nxtche=="captain")	return nxtcol;
    										}
    										if(!outside(i+(k<<1),j+((l<<1)+l))&&!exist(i+k,j+(l<<1))&&!exist(i,j+l))
    										{
    											string nxtcol=getcolor(i+(k<<1),j+((l<<1)+l)),nxtche=getchess(i+(k<<1),j+((l<<1)+l));
    											if(nxtcol==revcol&&nxtche=="captain")	return nxtcol;
    										}
    									}
    								}
    							}
    						}
    					}
    					else if(curche=="soldier")
    					{
    						for(int k=-1;k<=1;++k)
    						{
    							if(k)
    							{
    								if(!outside(i+k,j))
    								{
    									string nxtcol=getcolor(i+k,j),nxtche=getchess(i+k,j);
    									if(nxtcol==revcol&&nxtche=="captain")	return nxtcol;
    								}
    								if(!outside(i,j+k))
    								{
    									string nxtcol=getcolor(i,j+k),nxtche=getchess(i,j+k);
    									if(nxtcol==revcol&&nxtche=="captain")	return nxtcol;
    								}
    								if(!outside(i+k,j+k))
    								{
    									string nxtcol=getcolor(i+k,j+k),nxtche=getchess(i+k,j+k);
    									if(nxtcol==revcol&&nxtche=="captain")	return nxtcol;
    								}
    								if(!outside(i+k,j-k))
    								{
    									string nxtcol=getcolor(i+k,j-k),nxtche=getchess(i+k,j-k);
    									if(nxtcol==revcol&&nxtche=="captain")	return nxtcol;
    								}
    							}
    						}
    					}
    				}
    			}
    		}
    		return "not";
    	}
    	bool checkove()
    	/*
    		result:
    			0: the game isn't over
    			1: the game is still alive
    	*/
    	{
    		bool red=0,blue=0;
    		for(int i=0;i<h;++i)
    		{
    			for(int j=0;j<w;++j)
    			{
    				if(getchess(i,j)=="captain")
    				{
    //					printf("[%d %d]
    ",i,j);
    					if(getcolor(i,j)=="red")	red=1;
    					else	blue=1;
    				}
    			}
    		}
    		return !red||!blue;
    	}
    	void moving(int sx,int sy,int tx,int ty)
    	{
    		evemap[tx][ty]=evemap[sx][sy];
    		evemap[sx][sy]="empty";
    	}
    	string final(string s)
    	{
    		if(s=="empty")	return "empty";
    		else
    		{
    			for(int i=0;i<s.length();++i)
    			{
    				if(s[i]=='-')
    				{
    					s[i]=' ';
    					break;
    				}
    			}
    			return s;
    		}
    	}
    	vector<string> movecaptain(int sx,int sy,int tx,int ty)
    	{
    		vector<string> res;
    //		printf("%s %s
    ",getcolor(sx,sy).c_str(),color.c_str());
    		if(over||!occaptain(sx,sy,tx,ty)||getcolor(sx,sy)!=color)
    		{
    			res.push_back("Invalid command");
    			return res;
    		}
    		else
    		{
    			string cur,eat,goi,ove,col,lor;
    			col=getcolor(sx,sy);
    			lor=getcolor(tx,ty);
    			cur=getchess(sx,sy);
    			eat=getchess(tx,ty);
                if(lor=="empty")    lor="";
    			if(eat=="empty")	eat="NA";
    			moving(sx,sy,tx,ty);
    			if(checkgoi()!="not")	goi="yes";
    			else	goi="no";
    			if(checkove())
    			{
    				over=1;
    				ove="yes";
    			}
    			else	ove="no";
    			cur=final(cur);
    			res.push_back(col+" "+cur);
    			if(lor!="") res.push_back(lor+" "+eat);
                else    res.push_back(eat);
    			res.push_back(goi);
    			res.push_back(ove);
    			return res;
    		}
    	}
    	vector<string> moveguard(int sx,int sy,int tx,int ty)
    	{
    		vector<string> res;
    		if(over||!ocguard(sx,sy,tx,ty)||getcolor(sx,sy)!=color)
    		{
    			res.push_back("Invalid command");
    			return res;
    		}
    		else
    		{
    			string cur,eat,goi,ove,col,lor;
    			col=getcolor(sx,sy);
    			lor=getcolor(tx,ty);
    			cur=getchess(sx,sy);
    			eat=getchess(tx,ty);
                if(lor=="empty")    lor="";
    			if(eat=="empty")	eat="NA";
    			moving(sx,sy,tx,ty);
    			if(checkgoi()!="not")	goi="yes";
    			else	goi="no";
    			if(checkove())
    			{
    				over=1;
    				ove="yes";
    			}
    			else	ove="no";
    			cur=final(cur);
    			res.push_back(col+" "+cur);
    			if(lor!="") res.push_back(lor+" "+eat);
                else    res.push_back(eat);
    			res.push_back(goi);
    			res.push_back(ove);
    			return res;
    		}
    	}
    	vector<string> moveelephant(int sx,int sy,int tx,int ty)
    	{
    		vector<string> res;
    		if(over||!ocelephant(sx,sy,tx,ty)||getcolor(sx,sy)!=color)
    		{
    			res.push_back("Invalid command");
    			return res;
    		}
    		else
    		{
    			string cur,eat,goi,ove,col,lor;
    			col=getcolor(sx,sy);
    			lor=getcolor(tx,ty);
    			cur=getchess(sx,sy);
    			eat=getchess(tx,ty);
                if(lor=="empty")    lor="";
    			if(eat=="empty")	eat="NA";
    			moving(sx,sy,tx,ty);
    			if(checkgoi()!="not")	goi="yes";
    			else	goi="no";
    			if(checkove())
    			{
    				over=1;
    				ove="yes";
    			}
    			else	ove="no";
    			cur=final(cur);
    			res.push_back(col+" "+cur);
    			if(lor!="") res.push_back(lor+" "+eat);
                else    res.push_back(eat);
    			res.push_back(goi);
    			res.push_back(ove);
    			return res;
    		}
    	}
    	vector<string> movehorse(int sx,int sy,int tx,int ty)
    	{
    		vector<string> res;
    		if(over||!ochorse(sx,sy,tx,ty)||getcolor(sx,sy)!=color)
    		{
    			res.push_back("Invalid command");
    			return res;
    		}
    		else
    		{
    			string cur,eat,goi,ove,col,lor;
    			col=getcolor(sx,sy);
    			lor=getcolor(tx,ty);
    			cur=getchess(sx,sy);
    			eat=getchess(tx,ty);
                if(lor=="empty")    lor="";
    			if(eat=="empty")	eat="NA";
    			moving(sx,sy,tx,ty);
    			if(checkgoi()!="not")	goi="yes";
    			else	goi="no";
    			if(checkove())
    			{
    				over=1;
    				ove="yes";
    			}
    			else	ove="no";
    			cur=final(cur);
    			res.push_back(col+" "+cur);
    			if(lor!="") res.push_back(lor+" "+eat);
                else    res.push_back(eat);
    			res.push_back(goi);
    			res.push_back(ove);
    			return res;
    		}
    	}
    	vector<string> movecar(int sx,int sy,int tx,int ty)
    	{
    		vector<string> res;
    		if(over||!occar(sx,sy,tx,ty)||getcolor(sx,sy)!=color)
    		{
    			res.push_back("Invalid command");
    			return res;
    		}
    		else
    		{
    			string cur,eat,goi,ove,col,lor;
    			col=getcolor(sx,sy);
    			lor=getcolor(tx,ty);
    			cur=getchess(sx,sy);
    			eat=getchess(tx,ty);
                if(lor=="empty")    lor="";
    			if(eat=="empty")	eat="NA";
    			moving(sx,sy,tx,ty);
    			if(checkgoi()!="not")	goi="yes";
    			else	goi="no";
    			if(checkove())
    			{
    				over=1;
    				ove="yes";
    			}
    			else	ove="no";
    			cur=final(cur);
    			res.push_back(col+" "+cur);
    			if(lor!="") res.push_back(lor+" "+eat);
                else    res.push_back(eat);
    			res.push_back(goi);
    			res.push_back(ove);
    			return res;
    		}
    	}
    	vector<string> moveduck(int sx,int sy,int tx,int ty)
    	{
    		vector<string> res;
    		if(over||!ocduck(sx,sy,tx,ty)||getcolor(sx,sy)!=color)
    		{
    			res.push_back("Invalid command");
    			return res;
    		}
    		else
    		{
    			string cur,eat,goi,ove,col,lor;
    			col=getcolor(sx,sy);
    			lor=getcolor(tx,ty);
    			cur=getchess(sx,sy);
    			eat=getchess(tx,ty);
                if(lor=="empty")    lor="";
    			if(eat=="empty")	eat="NA";
    			moving(sx,sy,tx,ty);
    			if(checkgoi()!="not")	goi="yes";
    			else	goi="no";
    			if(checkove())
    			{
    				over=1;
    				ove="yes";
    			}
    			else	ove="no";
    			cur=final(cur);
    			res.push_back(col+" "+cur);
    			if(lor!="") res.push_back(lor+" "+eat);
                else    res.push_back(eat);
    			res.push_back(goi);
    			res.push_back(ove);
    			return res;
    		}
    	}
    	vector<string> movesoldier(int sx,int sy,int tx,int ty)
    	{
    		vector<string> res;
    		if(over||!ocsoldier(sx,sy,tx,ty)||getcolor(sx,sy)!=color)
    		{
    			res.push_back("Invalid command");
    			return res;
    		}
    		else
    		{
    			string cur,eat,goi,ove,col,lor;
    			col=getcolor(sx,sy);
    			lor=getcolor(tx,ty);
    			cur=getchess(sx,sy);
    			eat=getchess(tx,ty);
                if(lor=="empty")    lor="";
    			if(eat=="empty")	eat="NA";
    			moving(sx,sy,tx,ty);
    			if(checkgoi()!="not")	goi="yes";
    			else	goi="no";
    			if(checkove())
    			{
    				over=1;
    				ove="yes";
    			}
    			else	ove="no";
    			cur=final(cur);
    			res.push_back(col+" "+cur);
    			if(lor!="") res.push_back(lor+" "+eat);
                else    res.push_back(eat);
    			res.push_back(goi);
    			res.push_back(ove);
    			return res;
    		}
    	}
    	vector<string> execute(int sx,int sy,int tx,int ty)
    	{
    		if(getchess(sx,sy)=="captain")	return movecaptain(sx,sy,tx,ty);
    		else if(getchess(sx,sy)=="guard")	return moveguard(sx,sy,tx,ty);
    		else if(getchess(sx,sy)=="elephant")	return moveelephant(sx,sy,tx,ty);
    		else if(getchess(sx,sy)=="horse")	return movehorse(sx,sy,tx,ty);
    		else if(getchess(sx,sy)=="car")	return movecar(sx,sy,tx,ty);
    		else if(getchess(sx,sy)=="duck")	return moveduck(sx,sy,tx,ty);
    		else if(getchess(sx,sy)=="soldier")	return movesoldier(sx,sy,tx,ty);
    		else	return vector<string>({"Invalid command"});
    	}
    }redplay,blueplay;
    void mapinitial()
    {
    	evemap.resize(20);
    	static vector<string> zero({"red-car","red-horse","red-elephant","red-guard","red-captain","red-guard","red-elephant","red-horse","red-car"});
    	static vector<string> one({"empty","empty","empty","empty","empty","empty","empty","empty","empty"});
    	static vector<string> two({"red-duck","empty","empty","empty","empty","empty","empty","empty","red-duck"});
    	static vector<string> three({"red-soldier","empty","red-soldier","empty","red-soldier","empty","red-soldier","empty","red-soldier"});
    	static vector<string> four({"empty","empty","empty","empty","empty","empty","empty","empty","empty"});
    	static vector<string> five({"empty","empty","empty","empty","empty","empty","empty","empty","empty"});
    	static vector<string> six({"blue-soldier","empty","blue-soldier","empty","blue-soldier","empty","blue-soldier","empty","blue-soldier"});
    	static vector<string> seven({"blue-duck","empty","empty","empty","empty","empty","empty","empty","blue-duck"});
    	static vector<string> eight({"empty","empty","empty","empty","empty","empty","empty","empty","empty"});
    	static vector<string> nine({"blue-car","blue-horse","blue-elephant","blue-guard","blue-captain","blue-guard","blue-elephant","blue-horse","blue-car"});
    	evemap[0]=zero;
    	evemap[1]=one;
    	evemap[2]=two;
    	evemap[3]=three;
    	evemap[4]=four;
    	evemap[5]=five;
    	evemap[6]=six;
    	evemap[7]=seven;
    	evemap[8]=eight;
    	evemap[9]=nine;
    	for(int i=0;i<evemap.size();++i)	evemap[i].resize(20);
    }
    int main()
    {
    // 	freopen("duck.in","r",stdin);
    //	freopen("own.out","w",stdout);
    	mapinitial();
    	redplay.color="red";
    	blueplay.color="blue";
    	int q,now=1;
    	scanf("%d",&q);
    //	printmap();
    	for(int i=1;i<=q;++i)
    	{
    		int sx,sy,tx,ty;
    		scanf("%d%d%d%d",&sx,&sy,&tx,&ty);
    //		printf("{%d %d %d %d}
    ",sx,sy,tx,ty);
    		vector<string> ret;
    		if(now&1)	ret=redplay.execute(sx,sy,tx,ty);
    		else	ret=blueplay.execute(sx,sy,tx,ty);
    		if(ret[0]=="Invalid command")	printf("Invalid command
    ");
    		else
    		{
    			printf("%s;%s;%s;%s
    ",ret[0].c_str(),ret[1].c_str(),ret[2].c_str(),ret[3].c_str());
    			if(ret[3]=="yes")	over=1;
    			now++;
    		}
    // 		if(i>=q-1)
    // 		printmap();
    	}
    	return 0;
    }
    
  • 相关阅读:
    低功耗蓝牙配对绑定解读和实践
    低功耗蓝牙ATT/GATT/Profile/Service/Characteristic规格解读
    Nordic官方网络资源介绍(官网/devzone/GitHub)
    板子功耗高的原因有哪些
    同样的代码在官方开发板上运行正常,在自己板子上就跑不起来,怎么办
    如何理解nRF5芯片外设PPI
    nRF5芯片外设GPIO和GPIOTE介绍
    定时模块app_timer用法及常见问题—nRF5 SDK模块系列二
    Flash访问模块FDS用法及常见问题—nRF5 SDK模块系列一
    nRF5 SDK软件架构及softdevice工作原理
  • 原文地址:https://www.cnblogs.com/orchid-any/p/14307555.html
Copyright © 2011-2022 走看看