hdu 2804 先打表找规律
2017-10-09 23:27
218 查看
写这道题时,由于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;
}
}
写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;
}
}
相关文章推荐
- HDU 5402 Travelling Salesman Problem (模拟 有规律)(左上角到右下角路径权值最大,输出路径)
- HDU 6172 Array Challenge 找规律+矩阵快速幂
- HDU 4990 Reading comprehension(找规律+矩阵快速幂)
- HDU 5480 Conturbatio (象棋_找规律)
- HDU 6090 Rikka with Graph (图论规律题)
- hdu 1030 Delta-wave(找规律)
- hdu 5000 Clone (dp + 找规律)
- hdu 4611 模拟+规律
- HDU 5033 Building(北京网络赛B题) 单调栈 找规律
- hdu 6090 Rikka with Graph(找规律)
- HDU 1525&&POJ 2348 Euclid's Game 规律博弈(难)
- HDU 5795 A Simple Nim (博弈 打表找规律)
- hdu 1097 a^b 找规律
- HDU rM. Frog’s Problem (打表找规律)
- HDU 5793 A Boring Question (打表找规律)
- HDU 5793 A Boring Question (找规律+快速幂)
- HDU 5795 A Simple Nim (找规律+sg函数+博弈)
- HDU-#4811Ball(找规律)
- hdu 1564 Play a game(博弈——找规律)
- hdu 1525 Euclid's Game(博弈——找规律)