刷刷水题,入个门先:
百练oj:2754 八皇后
西电oj:1010 素数环
Poj:1011 Sticks
百练oj:2754 八皇后
不过这道题还用存下每个可能解。
下面是代码:
#include<iostream>
#include<cmath>
using namespace std;
const int maxn = 100;
const int N = 8;
int A[maxn];
int Ans[maxn][10];
int n,b,tot;
void eight_queen(int cur)
{
if(cur == N+1)
{
tot++;
for(int i = 1; i <= N; i++) Ans[tot][i] = A[i];
}
for(int i = 1; i <= N; i++)
{
A[cur] = i;
int ok = 1;
for(int j = 1; j < cur; j++)
{
if(A[j]== A[cur] || A[cur]-cur == A[j]-j || A[cur] + cur == A[j] + j)
{
ok = 0;
break;
}
}
if(ok) eight_queen(cur+1);
}
}
int main()
{
cin>>n;
tot = 0;
eight_queen(1);
while(n--)
{
cin>>b;
//cout<<tot<<endl;
for(int i = 1; i <= N; i++)
{
cout<<Ans[b][i];
}
cout<<endl;
}
return 0;
}
西电oj:1010 素数环
这道题和八皇后差不多,直接代码:
#include<iostream>
using namespace std;
const int maxn = 21;
int A[maxn];
int Prime[maxn];
int n,T;
int is_prime(int j)
{
for(int i = 2; i * i <= j; i++)
{
if(j%i == 0) return 0;
}
return 1;
}
void solve(int cur)
{
if(cur == n+1)
{
for(int i = 1; i < cur; i++)
{
if(i == 1) cout<<A[i];
else cout<<" "<<A[i];
}
cout<<endl;
return;
}
for(int i = 2; i <= n; i++)
{
A[cur] = i;
int ok = 1;
for(int j = 1; j < cur; j++)
if(A[j] == i) ok = 0;
if(ok)
{
if(cur == 1) solve(cur+1);
else
{
int t = A[cur-1] + A[cur];
if(is_prime(t))
{
if(cur < n) solve(cur+1);
else if(cur == n && is_prime(A[cur]+A[1])) solve(cur+1);
}
}
}
}
}
int main()
{
A[1] = 1;
T = 0;
while(cin>>n)
{
T++;
cout<<"Case "<<T<<":\n";
solve(2);
cout<<endl;
}
return 0;
}
Poj:1011 Sticks
这道题很经典,剪枝的方法要自己仔细体会。
一、stick的长度要是总长的约数
二、将part按从大到小排序
三、每次要判断还差多少长度可以拼凑出一个完整的stick
四、一些特判,orz。。。
下面是代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 65;
int A[maxn];
bool used[maxn];
int n;
bool cmp(int a,int b)
{
return a > b;
}
bool ok(int re,int len,int length)
{
if(re == 0 && len == 0) return true;
if(len == 0) len = length;
for(int i = 0; i < n; i++)
{
if(used[i]) continue;
if(A[i] > len) continue;
if(i && !used[i-1] && A[i-1] == A[i]) continue;
used[i] = true;
if(ok(re-1,len-A[i],length)) return true;
used[i] = false;
if(A[i] == len || len == length) break;// something wrong here
}
return false;
}
int main()
{
while(cin>>n)
{
if(n == 0) break;
int tot = 0;
for(int i = 0; i < n; i++)
{
used[i] = false;
cin>>A[i];
tot += A[i];
}
sort(A,A+n,cmp);
for(int i = A[0]; i <= tot; i++)
{
if(tot%i == 0)
{
if(ok(n,0,i))
{
cout<<i<<endl;
break;
}
}
}
}
return 0;
}