P1288 取数游戏 II
本质上就是看到0的次数是偶数还是奇数,也决定了谁能赢,正反方向取出第一个0即可。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int a[25];
for(int i=1;i<=n;i++)
cin>>a[i];
if(a[1]==0&&a[n]==0)
{
cout<<"NO";
return 0;
}
int b[25];
int k,q;
for(int i=1;i<=n;i++)
{
if(a[i]==0) {
b[i]=i-1;
k=i-1;
break;
}
}
for(int j=n;j>=1;j--)
{
if(a[j]==0) {
q=n-j;
break;
}
}
if(k%2==1||q%2==1) cout<<"YES";
else cout<<"NO";
}
P2197 【模板】Nim 游戏
本质是sg函数,只需要让其的位运算,若为0则是必败点。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
for(int i=1;i<=t;i++)
{ int s=0;
int n;
int a[10005];
cin>>n;
for(int j=1;j<=n;j++)
{
cin>>a[j];
s=s^a[j];
}
if(s==0) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
}
P1002 [NOIP2002 普及组] 过河卒
本事就是一个简单的dp,找到规律即可
#include<bits/stdc++.h>
using namespace std;
long long a,b,c,d;
int tot=0;
int vis[25][25];
long long mmap[25][25];
int dx[8]={1,2,-1,2,-2,1,-2,-1};
int dy[8]={2,1,2,-1,1,-2,-1,-2};
int main()
{
memset(vis,0,sizeof(vis));
cin>>c>>d>>a>>b;
c++;
d++;
a++;
b++;
memset(mmap,0,sizeof(mmap));
mmap[1][2]=1;
mmap[2][1]=1;
vis[a][b]=1;
mmap[a][b]=0;
for(int i=0;i<=7;i++)
{ if(a+dx[i]>=1&&a+dx[i]<=c&&b+dy[i]>=1&&b+dy[i]<=d)
{
vis[a+dx[i]][b+dy[i]]=1;
mmap[a+dx[i]][b+dy[i]]=0;
}
}
for(int i=3;i<=d;i++)
{ if(vis[1][i]!=1)
mmap[1][i]=mmap[1][i-1];
}
for(int i=3;i<=c;i++)
{ if(vis[i][1]!=1)
mmap[i][1]=mmap[i-1][1];
}
for(int i=2;i<=c;i++)
{
for(int j=2;j<=d;j++)
{ if(vis[i][j]!=1)
mmap[i][j]=mmap[i-1][j]+mmap[i][j-1];
}
}
cout<<mmap[c][d];
}