33,027
社区成员




enum STATE{
STATE_NONE,//空状态
STATE_OK, //可以转变为需要的
STATE_FAIL,//无法转变
STATE_PASS //已为需要的块
};
STATE state[4] = {0};
int oneBlockNums[] = {1,3,2,5};//PASS 需要的连续1块的分布
int oneBlockLength = 0; //连续的1的长度
int blockIndex = 0; //块索引
int oneInBlock = 0; //块中1个数
int zeroInBlock = 0; //块中0个数
int numArray[] = {2,0,1,0,2,1,1,0,0,1,1,1,2,0,1,1,1,0,2};//2代表x,不可能为1,所以需要在数组两段加上2
int arynum = sizeof(numArray)/sizeof(int);
int blocknum = sizeof(oneBlockNums)/sizeof(int);
bool processBegan = false; //此参数防止开头有很多x的情况
bool previousOne = false; //上一个数字为1
for(int i = 0; i < arynum; i++)
{
if(processBegan == false && numArray[i] != 2)
processBegan = true;
if(processBegan) {
if(blockIndex > blocknum - 1) //实际块数大于要求块数,退出循环,之后相当于都为FAIL
break;
if(numArray[i] == 1)
{
oneInBlock++;
oneBlockLength++;
previousOne = true;
}
else if(previousOne) //上一个数是1,当前不是1
{
if(oneBlockLength == oneBlockNums[blockIndex])
{
state[blockIndex] = STATE_PASS;
oneInBlock = 0; //若此块PASS,则进入下一块
zeroInBlock = 0;
blockIndex++;
}
else if(oneBlockLength > oneBlockNums[blockIndex])
{
state[blockIndex] = STATE_FAIL;//若此块FAIL,则进入下一块
oneInBlock = 0;
zeroInBlock = 0;
blockIndex++;
}
oneBlockLength = 0;
previousOne = false;
}
if(numArray[i] == 0)
{
if(oneInBlock + zeroInBlock >= oneBlockNums[blockIndex]) //足够满足该块,则进入下一块
{
state[blockIndex] = STATE_OK;
oneInBlock = 0;
zeroInBlock = 0;
blockIndex++;
}
zeroInBlock++;
}
else if(numArray[i] == 2)
{
if(state[blockIndex] != STATE_PASS)
{
if(oneInBlock != 0) { //防止xxxx时每次x都累加块
if(oneInBlock + zeroInBlock >= oneBlockNums[blockIndex]) //块内0个数加上1个数就是最大的可能数
{
state[blockIndex] = STATE_OK;
}
else
{
state[blockIndex] = STATE_FAIL;
}
blockIndex++;
}
oneInBlock = 0;
zeroInBlock = 0;
}
}
}
}
cout << state[0] <<" "<< state[1] <<" "<< state[2] <<" "<<state[3]<<endl;