题目名称 1448. [USACO Mar]石子游戏
输入输出 rocksa.in/out
难度等级 ★☆
时间限制 1000 ms (1 s)
内存限制 256 MiB
测试数据 10
题目来源 Gravatarcqw 于2013-11-30加入
开放分组 全部用户
提交状态
分类标签
分享题解
通过:24, 提交:34, 通过率:70.59%
Gravatar数声风笛ovo 100 0.000 s 0.00 MiB C++
Gravatar数声风笛ovo 100 0.004 s 13.66 MiB C++
Gravatarlingyixiaoyao 100 0.005 s 13.66 MiB C++
Gravatarcstdio 100 0.013 s 0.34 MiB C++
Gravatar旺仔小馒头 100 0.013 s 0.85 MiB C++
Gravatardigital-T 100 0.015 s 0.33 MiB C++
Gravatarmikumikumi 100 0.016 s 0.31 MiB C++
Gravatar数声风笛ovo 100 0.018 s 13.66 MiB C++
GravatarHouJikan 100 0.020 s 0.47 MiB C++
Gravatar稠翼 100 0.024 s 0.93 MiB Pascal
本题关联比赛
20131130
20131130
H大佬的水题争霸赛
20191218
关于 石子游戏 的近10条评论(全部评论)
#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;
}
Gravatar404
2016-09-25 14:46 7楼
没有评测插件差评!cin这么慢!
GravatarSatoshi
2015-09-20 14:50 6楼
尼玛,正解就是暴力,想了半天该怎么写
Gravatarmikumikumi
2015-09-20 00:51 5楼
评测插件呢==
Gravatar超级傲娇的AC酱
2013-12-01 09:20 4楼
Gravatarcstdio
2013-11-30 20:27 3楼
回复 @digital-T :
准确说是“修改位置”的字典序
Gravatarcstdio
2013-11-30 20:27 2楼
哈哈哈。。dfs按字典序走,输出时按OOX这种走,谁知道是XOO,输出左右顺序一改就对了。。。
再顺便吐槽一下USACO练胆题系列
Gravatardigital-T
2013-11-30 19:51 1楼

1448. [USACO Mar]石子游戏

★☆   输入文件:rocksa.in   输出文件:rocksa.out   评测插件
时间限制:1 s   内存限制:256 MiB

【题目描述】


在奶牛们回家休息之前,Farmer_Jnhn想让它们做一个智力游戏。

游戏的棋盘由地面上N (1≤N≤15个)相同的洞洞构成,初始状态均为空。游戏的玩法是:走一步要么是把一颗石子填在一个原来是空的洞洞里,要么是从原来不空的洞洞里取走石子。游戏的状态定义成哪些洞洞填了石子,哪些洞洞没有填石子。游戏的目标是达到所有可能的状态一次且仅一次,然后回到所有洞洞全为空的初始状态。

奶牛们玩这个游戏可费了脑筋了下面是一个例子:

洞洞

步数1 2 3

0 O O O 初始状念

1 O O X 放一棵石子在第3洞

2 X O X 放一颗石子在第1洞

3 X O O 取走第3洞的石子

4 X X O 放一颗行子住笫2洞

5 O X O 取走第1洞的石子

6 O X X 放一颗石子在第3洞

7 X X X 放一颗石子在第1洞

         现在,奶牛纠结了!它们必须从某个洞洞取走一颗石子,但无论取走哪颗石子,都要回到一个曾经到达过的状念。例如,如果取走笫2个洞洞的石子,到达状态(X O X),这个状态在第2步已经出现过。

         以下是一个N=3的合法移动方案:

         洞洞

步数1 2 3

0 O O O 初始状态

1 O X O 放一颗石子在第2洞

2 O X X 放一颗石子在第3洞

3 O O X 取走第2洞的石子

4 X O X 放一颗石子在第1洞

5 X X X 放一颗石子在第2洞

6 X X O 取走第3洞的石子

7 X O O 取走第2洞的石子

8 O O O 取走第1洞的石子

             奶牛们玩得精疲力竭,想得到你的帮助。请你写一个程序,给定N,求出一个合法的移动顺序,来赢得游戏。如果有多个方案,任求一个即可。


【输入格式】

第1行:一个整数N

【输出格式】


第1--2^N+1行:每行一个长度为N的字符串,串中仅包含'O'和'X'(O代表空洞洞,X表示不空的洞洞)。串中第j个字符表示第j个洞洞的状态。第1行和最后一行都是全'O'的状态。


【样例输入】

3

【样例输出】

OOO
OXO
OXX
OOX
XOX
XXX
XXO
XOO
OOO

【提示】

在此键入。

【来源】

在此键入。