这是一道稍微有点难度的模拟题,通过模拟实际运行的情况,通过队列进行宽搜,重点在于判断齿轮会不会卡住,最后得出结论。
1.算法
(1)预处理:
将所有的齿轮坐标和半径读取,保存在x,y,r三个数组中,然后进行相切判断,两两进行判断,将结果放置在map中,map[i][0]表示有几个齿轮和第i个齿轮相切,map[i][1~x]分别表示和第i个齿轮相切的x个齿轮的号码。
(2)操作:
依次对1~n中的每一个齿轮做检查,判断如果将该齿轮去掉能不能成功。检查操作如下:
从1号齿轮开始,根据map中的相切情况,依次向后进行宽搜,直到搜索到最后一个目标齿轮。
在这个过程中需要注意的是判断齿轮是否会卡住,这里采用齿轮的index(index表示该齿轮是第几个从动齿轮)来判断,比如,1号齿轮index是1,1号齿轮与2号3号分别相切,那2号和3号齿轮的index都是2,如此依次往后,index在队列中存储。当要在队列中加一个齿轮时,要先对队列当前齿轮进行一次遍历,如果发现这个齿轮已经在队列中就不要添加,并判断当前的index和该齿轮在队列中的index,如果两者差是奇数,则齿轮被卡住,该检查失败,返回(想想为什么)。
2.实现
(1)对于队列的操作要注意下标的表示不能太长,可以新建另一个变量保存其值,然后让这个对象作为下标,太长的下标会使得程序看起来很混乱。
(2)注意对于边界值0的处理
(3)在时间足够的情况下可以考虑穷举法解题。
#include<cstdio>
#include<cmath>
int n;
double x[1000];
double y[1000];
double r[1000];
int map[1000][1000];//map[1][0] means the 1st have how many nears;
bool near(int i,int j){
float dis_mul = sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
float dis_r = r[i]+r[j];
if(dis_mul <= dis_r)return true;
else return false;
}
void prework(){
for(int i=1;i<=n;i++)
map[i][0]=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lf%lf%lf",&(x[i]),&(y[i]),&(r[i]));
}
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(near(i,j)){
map[i][++map[i][0]] = j;
map[j][++map[j][0]] = i;
}
}
}
}
bool check(int x){
int result=false;
struct unit{
int id;
int index;
};
unit queue[1000];
int p=0,q=1;
queue[0].id=1;
queue[0].index=1;
while(p!=q){
for(int i=1;i<=map[queue[p].id][0];i++){
unit temp;
temp.id = map[queue[p].id][i];
temp.index=queue[p].index+1;
if(temp.id!=x){
bool flag = true;
for(int j=0;j<q;j++){
if(queue[j].id==temp.id){
if((temp.index-queue[j].index)%2==1){
return false;
}
flag=false;
}
}
if(flag){
queue[q].id=temp.id;
queue[q].index=temp.index;
if(queue[q].id==n){
result=true;
}
q++;
}
}
}
p++;
}
return result;
}
int main(){
prework();
// for(int i=1;i<=n;i++){
// printf("%d\n",map[i][0]);
// for(int j=1;j<=map[i][0];j++){
// printf(" %d",map[i][j]);
// }
// printf("\n");
// }
bool done=false;
if(check(0)){
printf("0\n");
done=true;
}
for(int i=1;i<=n&&!done;i++){
if(check(i)){
printf("%d\n",i);
done=true;
}
}
if(!done){
printf("-1\n");
}
return 0;
}
分享到:
相关推荐
《O'Neil_Advanced_Engineering_Mathematics_7th_txtbk》这本书是工程数学领域的一本经典教材,由著名数学家O'Neil撰写,涵盖了高等工程数学的多个核心概念和技术。以下是从该书的部分内容中提取的关键知识点,旨在...
/20210321/5b5da8b457b800e7761d059d170da9f0.zip
这里,MLF 定义为 E_\alpha(D_alpha*q^2*t^\alpha)。 多项式系数查找表在 Matlab 数据文件 'da_7th_order_coefficients.mat' 和 'dz_7th_order_coefficients.mat' 中提供,它们需要加载到您的工作区中,以提供名为 ...
经典教材,许多学校都用为教材,作者是R.L. Burden and J.D. Faires。这是第7版,希望有高人能上传第8版。格式为djvu,可以用cutePDF转为PDF格式。
根据提供的文件信息,我们可以推断文件是关于《Principles of Instrumental Analysis》这本书的第七版。这本书似乎被作者描述为“很不错应用资料,值得学习,分享给大家,希望你们有收获”。这表明了该书在分析仪器...
### Microelectronic Circuits by Sedra Smith 7th Edition #### 教材概述与核心特点 《微电子电路》(第七版)是由Adel S. Sedra和Kenneth C. Smith共同编著的一本市场领先的教科书。本书延续了作者们一贯的卓越...
Matlab数据文件中提供了多项式系数查找表'da_7th_order_coefficients.mat' 需要加载到您的工作区中,以提供名为 'da_7th_order_coefficients' 的参数数组变量。 表中的系数是针对 alpha 值计算的,精度为 0.001。 ...
- **∫∫_S f(x,y,z) dσ**:表面积分 - **∂(f,g)/∂(u,v)**:雅可比矩阵 - **f(x_0−), f(x_0+)**:函数 \( f(x) \) 在 \( x_0 \) 处的左极限和右极限 - **F[f] 或 \(\hat{f}\)**:傅里叶变换 - **F[f](ω) 或 \(\...
这些MATLAB文件展示了如何构建反馈控制环路,包括比例(P)、积分(I)和微分(D)控制器的设计和性能分析。 3. **动态系统模型** 文件如`fig6_70.m`和`fig6_82.m`可能涉及到系统传递函数、状态空间模型等动态系统...
经典经济学教材,N. Gregory Mankiw is Professor of Economics at Harvard ... After earning a Ph.D. in economics from MIT, he began teaching at Harvard in 1985 and was promoted to full professor in 1987.
IEEE P802.3cd D3.1标准是国际电气和电子工程师协会(IEEE)制定的一系列以太网标准之一,重点关注光通信硬件的开发。该标准详细规定了特定的数据通信网络以及链路层和物理层规范。IEEE 802.3是与以太网技术有关的...
标题中的“Intel_Graphics_Driver_21.20.16.4839_Win64_hacked_by_h_f22.rar”表明这是一款针对Intel图形处理器的驱动程序,版本号为21.20.16.4839,专为64位的Windows操作系统设计。值得注意的是,它带有“hacked_...
C++ Programming: Program Design Including Data Structures (7th Revised edition) By D. S. Malik 2015 | 1680 Pages | ISBN: 1285852753 | PDF | 25 MB C++ PROGRAMMING: PROGRAM DESIGN INCLUDING DATA ...
- **方向导数**:\( D_u \phi(P) \) 表示函数 \( \phi \) 在点 \( P \) 沿着方向 \( u \) 的方向导数。 #### 七、傅里叶变换 - **傅里叶变换**:\( F[f] \) 或 \( \hat{f} \) 表示函数 \( f \) 的傅里叶变换。 -...
Brian D. Hahn 和 Daniel T. Valentine 是本书的作者,他们可能在MATLAB的教育和应用方面拥有深厚的背景。本书自2002年以来经历了多次出版,每次出版都有可能涉及内容的更新和修订,以便跟上MATLAB软件的发展和技术...
Schwartz, brian d foy 和 Tom Phoenix - **出版社**:O'Reilly Media, Inc. - **出版日期**:2016年10月 - **ISBN**:978-1-491-95432-4 #### 二、书籍主旨与目标读者 《Learning Perl》第七版旨在为初学者提供一...
Franklin、John D. Powell和David L. Emami-Naeini等专家共同编写。这两本书深入浅出地介绍了反馈控制系统的设计与分析方法,是工程师和学者在自动控制领域的必备参考书籍。 第六版和第七版在内容上都涵盖了动态...