这道题目的难点主要在如何判断进入了循环,已经如何判断下一次的状态,总体来说还是比较容易的。
函数中的is_sleep()函数成功的解决了很多的问题,非常的好用。
下面贴上代码
//主要难点在于如何判断一直没有全醒的状态,保存各个状态,如果之前出现过这个状态,那么就一定会重复下去//根据当前状态判断下一次的状态问题#include#include using namespace std;vector state[10];//保存状态int awaken[10],sleep[10];int num_student;void clear_vec(){ for(int i=0;i<10;i++) { state[i].clear(); }}bool initial(){ clear_vec(); scanf("%d",&num_student); if(!num_student) return false;//printf("num_student=%d\n",num_student); for(int i=0;i awaken[student]) { return true; } return false;}int next(int student,int num_state)//student是学生代号,num_state是第几个状态{ if(sleep[student]==state[student][num_state]) { return 1;//睡觉的最后一个时刻,下一个时刻该醒了 } if(state[student][num_state]>awaken[student]) { //睡觉中间状态 return state[student][num_state]+1;//还是睡觉状态 } if(state[student][num_state] cnt_awake) { //可以睡觉 return state[student][num_state]+1; } else { return 1;//继续醒着 } }}bool is_cycle(int num_state){ for(int j=0;j