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