lanqiao OJ 118 机器人塔

简介: lanqiao OJ 118 机器人塔

1.机器人塔 - 蓝桥云课 (lanqiao.cn)

这是一个dfs的题,但是我们只排列最后一行,搜索最后一行的所有排列,最后一行的排列可以决定上一行的排列,最终得到第一行的排列 , 所以我们用一个init()函数,来让补充整一个三角形,但是我们要首先得到最后一行的长度,因为能排满整一个三角形,tmp = sqrt(1 + 8 * (a + b)) ;line = (tmp - 1) / 2 ;就能的出最后一行的长度,因为每一个点我们都可以填连个字符 ,一个是A , 一个B , 我们可以再Adfs退回来的时候进入Bdfs,这样就能得到所有的排列了 ,然后就是最后的检查,因为我们排出来的机器人阵型一定是对的,但是我们要判断的是我们用的机器人数量是不是和题目所给的是一样的,如果一样就返回值+1 ;

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std ;
int a ,b ;//机器人ab的数量
int cnt ; //最终可以拍成的阵型的数量
char mp[110][110] ;//我们的机器人阵型存储
int line , tmp ;//最后一行的长度
bool check(){//检查机器人数量是否和题目所给的一致
  int num_a = 0 , num_b = 0 ;
  for(int i = 1 ; i <= line ; i ++){
    for(int j = 1; j <= i ; j ++){
      if(mp[i][j] == 'A') num_a ++ ;
      else num_b ++ ;
    }
  }
  if(num_a == a && num_b == b) {
    return true ;
  }else return false ;
}
 
 
void init(){//已经排好了最后一行,根据最后一行排满整个阵型
  for(int i = line ;i >= 2 ; i -- ){
    for(int j = 1 ; j <= line ; j ++){
      if(mp[i][j] == mp[i][j+1]){
        mp[i-1][j] = 'A' ;
      }else {
        mp[i-1][j] = 'B' ;
      }
    }
  } 
}
void dfs(int n ){//搜索最后一排的所有排列
  if(n == line + 1){
    init() ;
    if(check()){
      cnt ++ ;
    }
    return ;
  }
  mp[line][n] = 'A' ;
  dfs(n+1) ;
  mp[line][n] = 'B' ;
  dfs(n+1) ;
}
 
 
int main(){
  ios::sync_with_stdio(false) ;
  cin.tie(0);
  cout.tie(0) ;
  cin >> a >> b ;
  tmp = sqrt(1 + 8 * (a + b)) ;//正三角形,求最后一行的长度
  line = (tmp - 1) / 2 ;
  dfs(1) ;
  cout << cnt << endl ;
  return 0 ; 
} 
相关文章
lanqiao OJ 1447 砝码称重
lanqiao OJ 1447 砝码称重
lanqiao OJ 182 小朋友崇拜圈
lanqiao OJ 182 小朋友崇拜圈
lanqiao OJ 3513 岛屿个数(2023省赛)
lanqiao OJ 3513 岛屿个数(2023省赛)
lanqiao OJ 110 合根植物
lanqiao OJ 110 合根植物
lanqiao OJ 1505 剪邮票
lanqiao OJ 1505 剪邮票
lanqiao OJ 234 大胖子走迷宫
lanqiao OJ 234 大胖子走迷宫
lanqiao OJ 网络寻路
lanqiao OJ 网络寻路
lanqiao OJ141 穿越雷区
lanqiao OJ141 穿越雷区
|
4月前
【洛谷 P1781】宇宙总统 题解(高精度+结构体排序)
在宇宙总统竞选中,需计算得到最高票者。程序接收$n$($1\leq n\leq 20$)个候选人及其票数,使用自定义比较器`cmp`对结构体数组`vote`按票数长度排序。样例输入5人,票数分别为98765、12365、87954、1022356、985678,输出显示编号为4的候选人(票数1022356)获胜。代码中,结构体`S`包含候选人ID和票数字符串,通过`sort`函数及`cmp`函数按票数长度降序排列,输出首位即为胜者。
29 0
1314:【例3.6】过河卒(Noip2002)
1314:【例3.6】过河卒(Noip2002)
132 0