(一) 问题描述:

/**
 * 请编写程序求解篮球错排问题。
 * 已知n个篮子一字排开(n为用户输入的任意正整数),从左到右分别标着号:1,2,... ...,n;每个球也有编号,分别也是1,2,... ...,n。
 * 现要将这n个球全部放入这n个篮子中,满足:每个篮子放置1个球,球的号不能与其所在的篮子的号相同,且在相邻篮子内的球的球号不能相邻。
 * 例如,如果在相邻两个篮子内的球的球号分别为9和10,则是不允许的。请输出所有符合要求的放球方式(对于每种符合要求的放球方式,都应输出在每个篮子中的球号)。
 */

(二) 源程序

#include <iostream>
using namespace std;

const int size = 10; //存放球的个数
int ball[size];     //存放球
int basket[size];   //存放篮子
int count = 0;      //解得个数

void checkAndDisply();
void rotate(int newsize);
void display();
void basketSort(int n);
void checkResult();

//循环右移
void rotate(int newsize)
{
 int position = size-newsize;
 int temp = ball[position];
 for(int i=position+1;i<size;i++)
  ball[i-1] = ball[i];
 ball[size-1] = temp;
}

//输出结果
void display()
{
 count++;
 cout<<"第"<<count<<"种方式是:"<<'/t';
 for(int i=1;i<=size;i++)
  cout<<"篮子"<<i<<"中的篮球号是:"<<basket[i-1]<<'/t';
 cout<<endl;
}

//将球进行全排列,并同时检验错排的情况
void basketSort(int n)
{
 if(size==1)
  return ;
 else
 {
  for(int j=0;j<n;j++)
  {
   basketSort(n-1);
   if(n==2)
    checkAndDisply();
   rotate(n);   //
  }
 }
}

//检验解得合法性
void checkAndDisply()
{
 for(int i=0;i<size;i++)
  basket[i] = ball[i];
 for(int j=0;j<size;j++)
 {
  if(basket[j]==j+1) //球的编号不能和篮子的编号相同
   break;
  if(j!=0)
   //相邻篮子内的球的球号不能相邻
   if(basket[j]-basket[j-1]==1||basket[j]-basket[j-1]==-1)
    break;
 }
 if(j==size) //得到一组解,显示出来
  display();
}

void checkResult()
{
 if(count==0)
  cout<<"问题无解!"<<endl;
}

int main()
{
 //生成球的数组
 for(int i=0;i<size;i++)
  ball[i] = i+1;
 basketSort(size);
 checkResult();
 return 0;
}

==============================================

换种写法写成可以动态更改要进行错排的球的数目,如下:

#include <iostream>
using namespace std;

void checkAndDisply(int N,int &count,int* ball,int* basket);
void rotate(int N,int newsize,int* ball);
void display(int N,int &count,int* basket);
void basketSort(int N,int n,int& count,int* ball,int* basket);

int main()
{
 int n;
 cout<<"Input Ball Number:";
 cin>>n;
 int *ball = new int[n];   //数组ball存放球
 int *basket = new int[n]; //数组basket存放篮子的
 int count = 0;           //解的个数
 for(int i=0;i<n;i++)
  ball[i] = i+1;
 basketSort(n,n,count,ball,basket);
 if(count == 0)
  cout<<"问题无解!"<<endl;
 return 0;

}

//循环右移
void rotate(int N,int newsize,int* ball)
{
 int position = N-newsize;
 int temp = ball[position];
 for(int i=position+1;i<N;i++)
  ball[i-1] = ball[i];
 ball[N-1] = temp;
}

//将球进行全排列,并同时检验错排的情况
void basketSort(int N,int n,int& count,int* ball,int* basket)
{
 if(N==1)
  return ;
 else
 {
  for(int j=0;j<n;j++)
  {
   basketSort(N,n-1,count,ball,basket);
   if(n==2)
    checkAndDisply(N,count,ball,basket);
   rotate(N,n,ball); 
  }
 }
}

//检验解得合法性
void checkAndDisply(int N,int &count,int* ball,int* basket)
{
 for(int i=0;i<N;i++)
  basket[i] = ball[i];
 int j;
 for(j=0;j<N;j++)
 {
  if(basket[j]==j+1) //球的编号不能和篮子的编号相同
   break;
  if(j!=0)
    //相邻篮子内的球的球号不能相邻
   if(basket[j]-basket[j-1]==1||basket[j]-basket[j-1]==-1)
    break;
 }
 if(j==N) //得到一组解,显示出来
  display(N,count,basket);
}

//输出结果
void display(int N,int &count,int* basket)
{
 count++;
 cout<<"第"<<count<<"种方式是:"<<'/t';
 for(int i=1;i<=N;i++)
  cout<<"篮子"<<i<<"中的篮球号是:"<<basket[i-1]<<'/t';
 cout<<endl;
}

Exe 4 篮球错排问题相关推荐

  1. Codeforces1600数学[CodeForces - 958E1[平面几何+暴力]CodeForces - 888D [组合数+错排问题]]

    A - Guard Duty (easy) CodeForces - 958E1 题目大意:给你n个基地和m个飞船,每个基地都要分配一共飞船,每个飞船都要在一共基地,任意两台飞船到基地得直线路径上不能 ...

  2. 转载:关于错排的相关知识

    转载:关于错排的相关知识 杭电2048相关知识充电 转自:错排公式 分类: 数论 关于程序2012-06-08 19:07 335人阅读 评论(0) 收藏 举报 n2 错排问题 错排问题 就是一种递推 ...

  3. hdu2068RPG的错排

    Problem Description 今年暑假杭电ACM集训队第一次组成女生队,其中有一队叫RPG,但做为集训队成员之一的野骆驼竟然不知道RPG三个人具体是谁谁.RPG给他机会让他猜猜,第一次猜:R ...

  4. 洛谷 P3182 [HAOI2016]放棋子(错排问题)

    题面 luogu 题解 裸的错排问题 错排问题 百度百科:\(n\)个有序的元素应有\(n!\)个不同的排列,如若一个排列使得所有的元素不在原来的位置上,则称这个排列为错排:有的叫重排.如,1 2的错 ...

  5. hdu1465 不容易系列之一(错排问题)

     Problem Description 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了! 做好"一件"事情尚且不易,若想永远成功而总从不失败,那更是难上加难 ...

  6. 浅谈错排公式的推导及应用

    近期学弟在HDU刷题时遇到了关于错排公式的一些问题,我作为过来人就写这篇博客来指导他们~~~ 错排的定义:一段序列中一共有n个元素,那么可知这些元素一共有n!种排列方法.假如在进行排列时,原来所有的元 ...

  7. HDU2049 组合数学 错排公式

    国庆期间,省城HZ刚刚举行了一场盛大的集体婚礼,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目,叫做"考新郎",具体的操作是这样的:  首先,给每位新娘打扮得几乎一模一 ...

  8. HDOJ 1465 不容易系列之一 【错排公式 递推】

    HDOJ 1465 不容易系列之一 [错排公式 递推] 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1465 题目就是说n个信封全部装错信的可能性是多 ...

  9. 错排、卡特兰数、斯特林数小结

    一. 错排 1.计算公式: 1) D[n] = (n-1)*(D[n-1]+D[n-2]) ,n>=2, D[0] = 1, D[1] = 0 . 解释:对于第n个要加入错排的数,它可以和已经错 ...

最新文章

  1. 怎么这一个c语言的dll文件,如何在C中获取DLL文件的版本信息
  2. python爬虫---requests库的用法
  3. eclipse下拉框里的选项怎么鼠标单击表判断_领导让我预测下一年销量,怎么办?...
  4. 中小型网站 seo 优化推广策略
  5. 前台jsp页面向后台传汉字出现乱码问题解决办法
  6. oracle中正则表达式相关函数regexp_like简介
  7. mysql maria引擎_MySQL/mariadb知识点——存储过程及存储引擎
  8. 系统集成Nacos和Feign
  9. 【Windows 8 Store App】学习三:HTTP
  10. 【IoT】创业:硬件创业之测试产品与产品本身一样重要
  11. 大商创x源码|大商创x全套源码|大商创小程序源码|大商创APP源码
  12. FPGA入门例程:LED
  13. shell 脚本获取时间戳
  14. 新睿云告诉您主流操作:分布式操作系统、批处理操作系统、分时操作系统优缺点分析!
  15. vue3后台管理系统(https://github.com/noob-Jp/my-admin-vue3)
  16. 动态规划解决贴纸拼字游戏
  17. dnf如何快速拾取物品_DNF宠物之最,快来Pick出你的挚爱
  18. 常州大学新生赛 F-大佬的生日礼包
  19. 《零基础入门学习Python》第023、024讲:递归:这帮小兔崽子、汉诺塔
  20. Python-(生成由0到9组成的n位数字)

热门文章

  1. 用户行为分析模型——RFM模型
  2. 树莓派学习笔记——Linux I2C驱动说明
  3. 汇编语言——ZF、PF、SF、CF、OF寄存器
  4. 在线看视频时,视频一卡一卡滴很不流畅!
  5. Unity 支持的各种格式
  6. ESP32-CAM之ST7789图像显示
  7. FS2114恒流模式的PWM升压IC,内置过温、关断、欠压、过流保护
  8. 前缀树算法模板秒杀 5 道算法题
  9. npm install 异常
  10. java项目使用技术要求_想学JAVA 这些技术要求你必须知道,否则没戏