题目大意:保龄球问题,满足Yes的条件是:第一个球被撞击,且必须<有一个或者两个球>的两列,之间存在<球全部被击倒>的一列。其余为No。(后面都写错成行了)
Start:
分析:找到符合条件的两行,在其之间找全部被击倒的行数,若存在,则满足条件。
实现方法:每一行的球数不同,所以可以采用vector进行对二维不定长数组的定义。寻找边界行时,有两层循环,第一层为行数,第二层为每行的球数,判断该行有<没被击倒的球>时,暂定为边界,然后用break跳出第二层循环,再去第一层循环往复。
代码:
#include<bits/stdc++.h>
using namespace std;
vector <int> vec[10]; // 二维不定长数组
string s; // 用来记录1和0
bool chk[12], flg;
void Pre_deal(){
vec[1].push_back(7);
vec[2].push_back(4);
vec[3].push_back(8);
vec[3].push_back(2);
vec[4].push_back(5);
vec[4].push_back(1);
vec[5].push_back(9);
vec[5].push_back(3);
vec[6].push_back(6);
vec[7].push_back(10);
}
int main()
{
Pre_deal();
cin >> s;
for(int i = 0; i < s.length(); i ++){
if(s[i] == '0') chk[i + 1] = 1; // 让chk记录球是否倒下,被击倒的球为1
}
if(!chk[1]){
puts("No"); // 第一个球必须倒下
return 0;
}
int l = 0, r = 0;
for(int i = 1; i <= 7; i ++){
for(int j = 0; j < vec[i].size(); j ++){
if(!chk[vec[i][j]]){ // chk[vec[i][j]]记录chk里面每个球的0/1
r = i;
break; //break为跳出for循环,每一行发现有没倒下的就记录并跳出循环
//不会跳出第一层循环,所以一直比下去,直到最右边
}
}
break;
}
for(int i = 7; i >= 1; i --){
for(int j = 0; j < vec[i].size(); j ++){
if(!chk[vec[i][j]]){ // chk[vec[i][j]]记录chk里面每个球的0/1
l = i;
break; //break为跳出for循环,每一行发现有没倒下的就记录并跳出循环::break语句对if-else的条件语句不起作用。
//一直比下去,直到最左边
}
}
}
if(l == r) flg = 0; //特别注意,这种情况!!
else{
for(int i = l; i <= r; i ++){
int cnt = 0; //计数器,每次都得从0记起
for(int j = 0; j < vec[i].size(); j ++){
if(chk[vec[i][j]]) cnt ++; //被击倒就记录加一
}
if(cnt == vec[i].size()){ //击倒数目等于本行全部数目
flg = 1;
break; //杜绝每一行发现都输出yes的情况
}
}
}
if(flg) puts("Yes");
else puts("No");
return 0;
}
需要注意:l == r 的情况