日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 芯聞號(hào) > 充電吧
[導(dǎo)讀]題目鏈接:HDU 5754 題面: Life Winner Bo Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 131072/13

題目鏈接:HDU 5754


題面:

Life Winner Bo Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 827????Accepted Submission(s): 309


Problem Description Bo is a "Life Winner".He likes playing chessboard games with his girlfriend G.

The size of the chessboard is N×M.The top left corner is numbered(1,1) and the lower right corner is numberd (N,M).

For each game,Bo and G take turns moving a chesspiece(Bo first).At first,the chesspiece is located at (1,1).And the winner is the person who first moves the chesspiece to (N,M).At one point,if the chess can't be moved and it isn't located at (N,M),they end in a draw.

In general,the chesspiece can only be moved right or down.Formally,suppose it is located at (x,y),it can be moved to the next point (x′,y′) only if x′≥x and y′≥y.Also it can't be moved to the outside of chessboard.

Besides,There are four kinds of chess(They have movement rules respectively).

1.king.

2.rook(castle).

3.knight.

4.queen.

(The movement rule is as same as the chess.)

For each type of chess,you should find out that who will win the game if they both play in an optimal strategy.

Print the winner's name("B" or "G") or "D" if nobody wins the game. ?
Input In the first line,there is a number T as a case number.

In the next T lines,there are three numbers type,N and M.

"type" means the kind of the chess.

T≤1000,2≤N,M≤1000,1≤type≤4 ?
Output For each question,print the answer. ?
Sample Input
4
1 5 5
2 5 5
3 5 5
4 5 5

?

Sample Output
G
G
D
B

?

Source 2016 Multi-University Training Contest 3


題意:

???? 給定N*M的棋盤(pán),一共4顆棋子,每次一種1顆棋子,從左上角出發(fā),到右下角的人獲勝。


解題:

??? 1.王的走法是向下向右1格,或同時(shí)向下向右1格,即(x+1,y)/(x,y+1)/)(x+1,y+1)三種走法,遞推推一下即可。一個(gè)節(jié)點(diǎn)的后繼為必?cái)B(tài),那么它為必勝態(tài),如果一個(gè)節(jié)點(diǎn)的后繼全都是必勝態(tài),那么它就是必?cái)B(tài),按剩余步數(shù),從小到大遞推一下即可。

???? 2.車(chē)的走法是橫向或豎向任意格,那么在對(duì)角線上必輸,因?yàn)橄仁肿呤裁床呗?,后手模仿即可,反之n!=m,先手只要使對(duì)方到對(duì)角線上即必勝。

???? 3.馬的走法和中國(guó)象棋是一樣的,日字形,馬比較特殊的是,會(huì)出現(xiàn)平局的情況,即誰(shuí)都不能到達(dá)(n,m),馬的遞推是,如果后繼中有必?cái)B(tài),那么當(dāng)前節(jié)點(diǎn)是必勝態(tài),如果后繼中都是必勝態(tài),那么當(dāng)前節(jié)點(diǎn)是必?cái)B(tài),如果后繼中有平局,那么當(dāng)前節(jié)點(diǎn)即為平局。(以上推導(dǎo)嚴(yán)格有序,即在排除了前一種情況的前提下成立)。

??? 4.皇后的走法和王類(lèi)似,不過(guò)王后是走任意步,或者沿斜線任意步。這其實(shí)可以看成,兩堆石子,要么從一堆取任意個(gè),要么從兩堆同時(shí)取相同任意個(gè)。這就是威佐夫博弈,可見(jiàn)這篇博客。

???? 這題綜合考察了幾種博弈,還是很不錯(cuò)的,沒(méi)有接觸過(guò)博弈的人,可以學(xué)到很多。


代碼:

#include 
#include 
#include 
#include 
#include 
#include 
#define LL long long
using namespace std;
bool king[1005][1005];
int horse[1005][1005];
bool vis[1005][1005];
int main()
{
	int t,type,n,m,s1,s2;
	memset(king,0,sizeof(king));
	king[0][0]=0;
	for(int i=0;i<=1000;i++)
	{
		for(int j=0;j<=1000;j++)
		{
			if(king[i][j]==0)
			{
				if(i+1<=1000)
				    king[i+1][j]=1;
				if(j+1<=1000)
					king[i][j+1]=1;
                if(i+1<=1000&&j+1<=1000)
					king[i+1][j+1]=1;
			}
		}
	}
    memset(horse,-1,sizeof(horse));
	horse[0][0]=0;
	for(int i=0;i<=1000;i++)
	{
		for(int j=0;j<=1000;j++)
		{
			s1=-2;s2=-2;
		   if(i-1>=0&&j-2>=0)
              s1=horse[i-1][j-2];
		   if(i-2>=0&&j-1>=0)
			  s2=horse[i-2][j-1];
           if(s1!=-2&&s2!=-2)
		   {
			   if(s1==0||s2==0)
				   horse[i][j]=1;
			   else if(s1==-1||s2==-1)
				   horse[i][j]=-1;
			   else
				   horse[i][j]=0;
		   }
		   if(s1!=-2||s2!=-2)
		   {
			   if(s1==0||s2==0)
				   horse[i][j]=1;
			   else if(s1==-1||s2==-1)
				   horse[i][j]=-1;
			   else
				   horse[i][j]=0;
		   }
		  
		}
	}
	scanf("%d",&t);
    while(t--)
	{
		int flag;
		scanf("%d%d%d",&type,&n,&m);
		if(type==1)
		{
			if(king[n-1][m-1]==1)
				flag=1;
			else
				flag=0;
		}
		else if(type==2)
		{
			if(n==m)
				flag=0;
			else
				flag=1;
		}
		else if(type==3)
		{
			n--;
			m--;
			if(horse[n][m]==-1)
				flag=2;
			else if(horse[n][m])
				flag=1;
			else
				flag=0;
		}
		else
		{
			int dif,tmp;
			n--;
			m--;
			if(n>m)
				swap(n,m);
		    dif=m-n;
			tmp=dif*(1.0+sqrt(5.0))/2;
			if(n==tmp)
				flag=0;
			else
				flag=1;
		}
		if(flag==2)
			printf("Dn");
		else if(flag==1)
			printf("Bn");
		else
			printf("Gn");
	}
	return 0;
}



本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉