写这道题时,由于n的规模很大,暴力搜索肯定不行,所以先写个dfs找出10组数据,找出规律
写dfs跟N皇后问题相似,我的程序较慢(打出几组数据还是没问题的)
dfs(打表)
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<string>
#define INF 99999999
#define LL long long
#define maxn 100
using namespace std;
int book[20][20];
int n,sum,res;
void jdgbook(int x,int y)
{
int xx,yy;
xx = x; yy = y;
while(xx>0) book[xx--][y]++;
xx = x; yy = y;
while(yy>0) book[x][yy--]++;
xx = x; yy = y;
while(xx<=n) book[xx++][y]++;
xx = x; yy = y;
while(yy<=n) book[x][yy++]++;
xx = x; yy = y;
while(xx<=n && yy<=n) book[xx++][yy++]++;
xx = x; yy = y;
//while(xx>0 && yy<=n) ch[xx--][yy++]++;
//xx = x; yy = y;
//while(xx<=n && yy>0) ch[xx++][yy--]++;
//xx = x; yy = y;
while(xx>0 && yy>0) book[xx--][yy--]++;
}
void frebook(int x,int y)
{
int xx,yy;
xx = x; yy = y;
while(xx>0) book[xx--][y]--;
xx = x; yy = y;
while(yy>0) book[x][yy--]--;
xx = x; yy = y;
while(xx<=n) book[xx++][y]--;
xx = x; yy = y;
while(yy<=n) book[x][yy++]--;
xx = x; yy = y;
while(xx<=n && yy<=n) book[xx++][yy++]--;
xx = x; yy = y;
//while(xx>0 && yy<=n) ch[xx--][yy++]--;
//xx = x; yy = y;
//while(xx<=n && yy>0) ch[xx++][yy--]--;
//xx = x; yy = y;
while(xx>0 && yy>0) book[xx--][yy--]--;
}
bool rejdgbook()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
if(book[i][j]<=0)
return false;
}
}
return true;
}
void dfs(int step)
{
if(rejdgbook()==true)
{
if(sum>res)
res=sum;
return ;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
if(book[i][j]<=0)
{
jdgbook(i,j);
sum++;
dfs(step+1);
frebook(i,j);
sum--;
}
}
}
}
int main()
{
while(cin>>n)
{
int ans=-1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
memset(book,0,sizeof(book));
res=-1;
jdgbook(i,j);
sum=1;
dfs(1);
ans=max(ans,res);
}
}
cout << ans << endl;
}
return 0;
}
ac代码
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
int main()
{
long long n;
while(cin>>n&&n)
{
if(n%3==0)
cout << n/3*2 << endl;
else
cout << (n+2)/3*2-1 << endl;
}
}