位运算比任何运算都要快!
这种代码会超时
#include<bits/stdc++.h>
using namespace std;
int n;
bool check(int x)
{
int ans=0;
for(int i=1;i<=5*5;++i)
{
if(x%2==1)
{
ans++;
}
x/=2;
}
return ans == n;
}
int a[35][35];
bool move(int x,int y,int dx,int dy)
{
for(int i=1;i<=5;++i)
{
if(a[x][y]==0)
{
return false;
}
x+=dx;
y+=dy;
}
return true;
}
int ask(int x)
{
for(int i=1;i<=5;++i)
{
for(int j=1;j<=5;++j)
{
if(x%2>0)
{
a[i][j]=1;
}
else
{
a[i][j]=0;
}
x/=2;
}
}
int ans=0;
for(int i=1;i<=5;++i)
{
ans+=move(i,1,0,1);
ans+=move(1,i,1,0);
}
ans+=move(1,1,1,1);
ans+=move(1,5,1,-1);
return ans;
}
bool vis[105];
int main()
{
cin>>n;
for(int i=1;i<(1<<25);++i)
{
if(check(i)==false)
{
continue;
}
vis[ask(i)]=true;
}
int ans=0;
for(int i=1;i<=12;++i)
{
if(vis[i]==true)
{
ans+=i;
}
}
cout<<ans;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n;
bool check(int x)
{
int ans=0;
for(int i=1;i<=5*5;++i)
{
if(x&1==1)
{
ans++;
}
x>>=1;
}
return ans == n;
}
int a[35][35];
bool move(int x,int y,int dx,int dy)
{
for(int i=1;i<=5;++i)
{
if(a[x][y]==0)
{
return false;
}
x+=dx;
y+=dy;
}
return true;
}
int ask(int x)
{
for(int i=1;i<=5;++i)
{
for(int j=1;j<=5;++j)
{
if(x&1>0)
{
a[i][j]=1;
}
else
{
a[i][j]=0;
}
x>>=1;
}
}
int ans=0;
for(int i=1;i<=5;++i)
{
ans+=move(i,1,0,1);
ans+=move(1,i,1,0);
}
ans+=move(1,1,1,1);
ans+=move(1,5,1,-1);
return ans;
}
bool vis[105];
int main()
{
cin>>n;
for(int i=1;i<(1<<25);++i)
{
if(check(i)==false)
{
continue;
}
vis[ask(i)]=true;
}
int ans=0;
for(int i=1;i<=12;++i)
{
if(vis[i]==true)
{
ans+=i;
}
}
cout<<ans;
return 0;
}
一下就能过!