题目一(poj-2965):传送门

思路:递归+枚举,遍历每一种情况,然后找出最小步骤的结果,与poj-1753类似。

#include<iostream>
#include<cstdio>
#include<cstring>
//#include<ctime>
using namespace std;
int x[],y[],xx[],yy[],ans=;
char str[];
int a[][];
void turn(int len)
{
int x=len/,y=len%;
for(int i=;i<;i++)
{
a[x][i]=!a[x][i];
a[i][y]=!a[i][y];
}
a[x][y]=!a[x][y];
}
bool pd()
{
for(int i=;i<;i++)
for(int j=;j<;j++)
if(a[i][j]!=) return false;
return true;
}
void dfs(int len,int num) //要用len,否则时间超限。
{
if(pd())
{
if(ans>num)
{
ans=num;
for(int i=;i<=ans;i++)
{
xx[i]=x[i];
yy[i]=y[i];
}
}
return ;
}
if(len>=) return ; //基准情形
dfs(len+,num);//先搜索
turn(len); //再变化
x[num+]=len/+;
y[num+]=len%+;
dfs(len+,num+); //记得回溯。
turn(len);
}
int main(void)
{
int i,j;
//int st=clock(),ed;
for(i=;i<;i++)
{
scanf("%s",str);
for(j=;j<;j++)
if(str[j]=='-') a[i][j]=;
else a[i][j]=;
}
dfs(,);
printf("%d\n",ans);
for(i=;i<=ans;i++)
{
printf("%d %d\n",xx[i],yy[i]);
}
//ed=clock();
//printf("time==%d\n",ed-st);
return ;
} //原来用x,y作为参数,时间超限
/*#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
using namespace std;
int a[10][10],mi=99;
int x[100],y[100],cnt=0;
int xx[100],yy[100];
char str[10];
bool pd()
{
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
if(a[i][j]==1) return false;
return true;
}
void turn(int x,int y)
{
for(int i=0;i<4;i++)
{
a[x][i]=!a[x][i];
a[i][y]=!a[i][y];
}
a[x][y]=!a[x][y];
}
void dfs(int x1,int y1,int num)
{
if(pd())
{
if(mi>num)
{
mi=num;
for(int i=1;i<=num;i++)
{
xx[i]=x[i];
yy[i]=y[i];
}
}
return ;
}
if(x1*y1>9) return ; if(y1==3) dfs(x1+1,0,num);
else dfs(x1,y1+1,num);
turn(x1,y1);
x[num+1]=x1+1;y[num+1]=y1+1;
if(y1==3) dfs(x1+1,0,num+1);
else dfs(x1,y1+1,num+1);
turn(x1,y1);
}
int main(void)
{
int i,j;
int st,ed;
st=clock();
for(i=0;i<4;i++)
{
scanf("%s",str);
for(j=0;j<4;j++)
if(str[j]=='+') a[i][j]=1;
else a[i][j]=0;
}
dfs(0,0,0);
printf("%d\n",mi);
for(i=1;i<=mi;i++)
{
printf("%d %d\n",xx[i],yy[i]);
}
ed=clock();
printf("time==%d\n",ed-st);
return 0;
}*/

题目二(poj-2368):传送门

思路:巴什博奕,求出使后者成功的最小的L,就是求n的非一最小因子-1,要用素数筛法,否则超时。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = ;
int a[maxn];
int main(void)
{
int n,i,m;
while(~scanf("%d",&n))
{
int len=;
for(i=;i*i<=n;i++)
{
if(n%i==)
{
a[len++]=i;
a[len++]=n/i;
}
}
sort(a,a+len);
int fg=;
for(i=;i<len;i++)
{
if(a[i]>=)
{
fg=;
printf("%d\n",a[i]-);
break;
}
}
if(fg==) printf("0\n");
}
return ;
}

总结:递归不要忘记确立分清楚基准情况,先搜索,再回溯。

假期训练八(poj-2965递归+枚举,hdu-2149,poj-2368巴什博奕)的更多相关文章

  1. (step8.2.4)hdu 1846(Brave Game——巴什博奕)

    题目大意:输入一个整数t,表示测试用例是.接着输入2个整数n,m.分别表示这堆石头中石头的个数,和每次所能取得最大的石头数.判断那一方为赢家 解题思路: 1)这是一道简单的巴什博弈: 所谓巴什博弈,是 ...

  2. POJ 2368 巴什博奕

    题目大意:给出n个按钮,每次最多可以按L个,按下最后一个按钮的人获胜.求使后手必定获胜的L的最小值(L>=2). 题目思路: 巴什博弈:只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少 ...

  3. HDU 1846 Brave Game 巴什博奕

    解题报告:Alice和Bob在做一个取石子游戏,有一堆n个石子,然后规定每个人每次最少要去1个石子,最多可以取m个石子,最后一次取完石子的人为胜. 巴什博奕,关键是找到必胜点和必败点,我们可以先列举出 ...

  4. HDU 2149-Public Sale(巴什博奕)

    Public Sale Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit  ...

  5. hdu 2149 (巴什博奕)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2149 Problem Description 虽然不想,但是现实总归是现实,Lele始终没有逃过退学的 ...

  6. 悼念512汶川大地震遇难同胞——选拔志愿者 HDU 2188 博弈论 巴什博奕

    悼念512汶川大地震遇难同胞--选拔志愿者 HDU 2188 博弈论 巴什博奕 题意 对于四川同胞遭受的灾难,全国人民纷纷伸出援助之手,几乎每个省市都派出了大量的救援人员,这其中包括抢险救灾的武警部队 ...

  7. HDU 5973 Aninteresting game 威佐夫博奕(Wythoff Game)

    HDU 5973:http://acm.hdu.edu.cn/showproblem.php?pid=5975 题意: 有两堆石子,每次可以从一堆石子中取任意个,或者从两堆石子中取相同个数的石子.两个 ...

  8. 假期训练七(hdu-2845 dp,hdu-1846,2188 巴什博奕)

    题目一:传送门 思路:动态规划,从每一行来看,每次更新求出这一点的最大值,dp[i]=MAX(dp[i-1],dp[i]+dp[i-2]),不会出现 两个数字相邻的情况:先对行进行更新,再对列进行更新 ...

  9. HDU 1856 Brave Game(巴什博奕)

    十年前读大学的时候,中国每年都要从国外引进一些电影大片,其中有一部电影就叫<勇敢者的游戏>(英文名称:Zathura),一直到现在,我依然对于电影中的部分电脑特技印象深刻. 今天,大家选择 ...

随机推荐

  1. vue 添加子路由,并对路由重定向

    // 用户信息首页 { path: '/user/index', name: 'userIndex', component: userIndex, redirect: '/user/index/sho ...

  2. eclipse Mars4.5.2安装fatjar

    试了在eclipse下添加plugins的方法,但是并没有生效 最后看了一篇博客@参考博客 原文转载: 首先声明,eclipse luna 和mars 楼主亲测可用. .安装Eclipse2.0版本的 ...

  3. java_15 System类

    1.System类 2.System类方法 (1)currentTimeMillis() public static void main(String[] args) { long start = S ...

  4. MongoDB的增、删、改、查操作(五)

    按照我们关系型数据库的思想,一个服务器要想存放数据,首先要有数据库,表,字段,约束,当然了也少不了主键,外键,索引,关系等: 但是在MongoDB的世界里边,我们不用预先的去创建这些信息从而直接来使用 ...

  5. Volley超时重试机制

    基础用法 Volley为开发者提供了可配置的超时重试机制,我们在使用时只需要为我们的Request设置自定义的RetryPolicy即可. 参考设置代码如下: int DEFAULT_TIMEOUT_ ...

  6. Java并发-ThreadGroup获取所有线程

    一:获取当前项目所有线程 public Thread[] findAllThread(){ ThreadGroup currentGroup =Thread.currentThread().getTh ...

  7. Numpy copy & deep copy

    1. '='的赋值方式会带有关联性 >>> import numpy as np >>> a = np.arange(4) >>> b = a & ...

  8. execute() 和 sumbit() 的区别

    execute()内部实现 1.首次通过workCountof()获知当前线程池中的线程数, 如果小于corePoolSize, 就通过addWorker()创建线程并执行该任务: 否则,将该任务放入 ...

  9. 迈科DPI和运营商合作比较多

    业界领先的DPI/DFI解决方案提供商 专注网络流量数据和应用性能数据的分析优化   业界领先的DPI/DFI解决方案提供商 专注网络流量数据和应用性能数据的分析优化 Previous Next DP ...

  10. linux下查看内存使用情况

    基本内存术语解读 1> free -m 同样是做为缓存,buffers和cache又有啥区别呢? 于是又查了些资料,发现buffers实际应该是叫“缓冲”,其英文解释是:A buffer is ...