Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
124889 硕博·黄凯麟·连读 派对灯 C++ 运行出错 75 0 MS 308 KB 2537 2024-01-23 16:07:15

Tests(6/8):


#include <iostream> #include <string> #include <vector> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; vector <string> ans;//存每种有效状态 int a[110];//目标串 int b[110];//去模拟C次按开关灯的状态 char tem[110];//为了将数组b模拟好的状态转换成String类型好去重,但数组b是从b[1]开始为灯的有效表示的,所以不能将b直接赋给string,于是就有了tem数组作为中间数组 int num = 0;//符合目标的个数 int n, c; void num1() { for (int i = 1; i <= n; ++i) { b[i] = !b[i]; } } void num2() { for (int i = 1; i <= n; i += 2) { b[i] = !b[i]; } } void num3() { for (int i = 0; i <= n; i += 2) { b[i] = !b[i]; } } void num4() { for (int i = 1; i <= n; i += 3) { b[i] = !b[i]; } } void dfs(int icount) { if (icount == c)//模拟按了c次开关 { int f = 1; for (int i = 1; i <= n; ++i) { if (a[i] == -1) continue; if (a[i] != b[i])//说明模拟失败 { f = 0; break; } } if (f)//模拟成功,b数组里面的值就是c次开关后,n个灯的正确状态之一 { num++;//符合目标的个数+1 for (int i = 0; i < n; ++i)//为了便于排序,将n个灯的状态放入vector中 tem[i] = b[i + 1] + '0'; tem[n] = '\0'; ans.push_back(tem); } return; } num1(); dfs(icount + 1); num1();//还原上一步状态 num2(); dfs(icount + 1); num2();//还原上一步状态 num3(); dfs(icount + 1); num3();//还原上一步状态 num4(); dfs(icount + 1); num4();//还原上一步状态 } int main() { ios::sync_with_stdio(false); int x; cin >> n >> c; if (c > 4) c = 4 - c % 2; //初始化 memset(a, -1, sizeof(a)); while (cin>>x && x != -1)//输入已知的ON的灯号 a[x] = 1; while (cin>>x && x != -1)//输入已知的OFF的灯号 a[x] = 0; memset(b, 1, sizeof(b));//初始时所有灯都开着,所以初始化为1 dfs(0); sort(ans.begin(), ans.end());//排序 cout<<ans[0].c_str()<<endl; for (int i = 1; i < num; ++i) { if (ans[i] != ans[i - 1]) //去重 cout<<ans[i].c_str()<<endl; } return 0; }


测评信息: