Gravatar
404
积分:123
提交:38 / 143
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
int ans[2<<16];
int n;
int vis[2<<16],sum=1;
bool flag;
int calc(int x)
{
int cnt=0;
while(x)
{
if(x&1)
cnt++;
x=x>>1;
}
return cnt;
}
void dfs(int now,int step)
{
if(now==0&&step>1&&step<sum+1) //加个剪枝瞬间就过了
return;
if(now==0&&step==sum+1){
flag=1;
for(int i=1;i<=step;i++){
for(int j=1;j<=n;j++)
if(ans[i]&(1<<(j-1)))printf("X");
else printf("O");
printf("\n");
}
return;
}
if(step+calc(now)>sum+1)
return;
for(int i=1;i<=n;i++)
{
int nx=now^(1<<(i-1));
if(nx!=0&&vis[nx])continue;
if(nx==0&&vis[nx]==1){
vis[nx]=2,ans[step+1]=nx;
dfs(nx,step+1);
ans[step+1]=0,vis[nx]=1;
if(flag)return;
}
else if(nx!=0&&vis[nx]==0){
vis[nx]=1,ans[step+1]=nx;
dfs(nx,step+1);
ans[step+1]=0,vis[nx]=0;
if(flag)return;
}
else
continue;
}
}
int main()
{
freopen("rocksa.in","r",stdin);
freopen("rocksa.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)sum=sum*2;
ans[1]=0,vis[0]=1;
dfs(0,1);
return 0;
}

Gravatar
Satoshi
积分:3010
提交:678 / 1922
没有评测插件差评!cin这么慢!

Gravatar
mikumikumi
积分:4128
提交:830 / 1893
尼玛,正解就是暴力,想了半天该怎么写

Gravatar
超级傲娇的AC酱
积分:646
提交:244 / 660
评测插件呢==

Gravatar
cstdio
积分:4755
提交:1198 / 2108

Gravatar
cstdio
积分:4755
提交:1198 / 2108
回复 @digital-T :
准确说是“修改位置”的字典序

Gravatar
digital-T
积分:2215
提交:586 / 1311
哈哈哈。。dfs按字典序走,输出时按OOX这种走,谁知道是XOO,输出左右顺序一改就对了。。。
再顺便吐槽一下USACO练胆题系列