P點:指後手贏
N點:指先手贏
現在關於P,N的求解有三個規則
(1):最終態都是P
(2):按照遊戲規則,到達當前態的前態都是N的話,當前態是P
(3):按照遊戲規則,到達當前態的前態至少有一個P的話,當前態是N
由規則可以求出狀態矩陣,由以下代碼可列印出
#pragma comment(linker,"/STACK:102400000,102400000")#include<iostream>#include<stdio.h>#include<algorithm>using namespace std;int sg[2001][2001];void Get_sg(){int i,j;memset(sg,-1,sizeof(sg));sg[1][2000]=0;for(i=1;i<=2000;i++)for(j=2000;j>=1;j--){if(i==1 && j==2000) continue;if(i==1){if(sg[i][j+1]==0)sg[i][j]=1;else sg[i][j]=0;}else if(j==2000){if(sg[i-1][j]==0)sg[i][j]=1;else sg[i][j]=0;}else {if(sg[i-1][j]==1 && sg[i-1][j+1]==1 && sg[i][j+1]==1){sg[i][j]=0;}elsesg[i][j]=1;}}}int main(){int n,m,i,j;Get_sg();while(scanf("%d%d",&n,&m),n+m){if(!sg[n][2001-m]) cout<<"What a pity!"<<endl;else cout<<"Wonderful!"<<endl;}return 0;}
直接交上去會逾時,所有可以根據矩陣找到規律
代碼如下:
#include <iostream>using namespace std;int main(){ int a,b; while(cin>>a>>b&&a&&b) { a%=2; b%=2; if(a&&b)cout<<"What a pity!"<<endl; else cout<<"Wonderful!"<<endl; }}