NC230527. EXTENDED LIGHTS OUT
描述
输入描述
输入的第一行是一个正整数 ,表示谜题个数。每个谜题将有行,每行有个数: 或 ,由一个空格分隔。 表示最初灯关闭,而 表示最初灯打开。
输出描述
对于每个谜题,输出:
第一行带有字符串:“PUZZLE #m”,其中 表示第个谜题。
在该行之后,是一个类似拼图的显示(与输入格式相同)。在这种情况下, 表示必须按下才能解谜的按钮,而 表示未按下的按钮。在类似拼图的输出显示中,每个 或 之间应该正好有一个空格。
示例1
输入:
2 0 1 1 0 1 0 1 0 0 1 1 1 0 0 1 0 0 1 1 0 0 1 0 1 0 1 1 1 0 0 0 0 1 0 1 0 1 0 1 0 1 1 0 0 1 0 1 1 1 0 1 1 0 0 0 1 0 1 0 0
输出:
PUZZLE #1 1 0 1 0 0 1 1 1 0 1 0 1 0 0 1 0 1 1 1 0 0 1 0 0 0 1 0 0 0 0 PUZZLE #2 1 0 0 1 1 1 1 1 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 1 0 1 1 0 1
C++(g++ 7.5.0) 解法, 执行用时: 35ms, 内存消耗: 492K, 提交时间: 2022-10-05 17:41:01
#include<bits/stdc++.h> using namespace std; int d[5][2] = {{0,0},{0,1},{0,-1},{1,0},{-1,0}}; int n = 30, a[50][50],cnt,ans[6][6]; int IDX = 1; void guess() { for(int i=0;i<n;i++){ int k=i; for(;k<n;k++) if(a[k][i]) break; for(int j=0;j<=n;j++) swap(a[i][j],a[k][j]); for(int j=0;j<n;j++){ if(i==j) continue; if(a[j][i]) for(int k=i;k<=n;k++) a[j][k]^=a[i][k]; } } for(int i=n-1;i>=0;i--) ans[i/6][i%6] = a[i][n]; } void my() { memset(a,0,sizeof a); for(int i=0;i<n;i++) cin>>a[i][n]; for(int i=0;i<n;i++) { int x = i/6, y = i%6; for(int j=0;j<5;j++) { int nx = x+d[j][0], ny = y + d[j][1]; if(nx<0 || nx>=5 || ny<0 || ny>=6) continue; a[i][nx*6 + ny] = 1; } } guess(); printf("PUZZLE #%d\n",IDX++); for(int i=0;i<5;i++) { for(int j=0;j<=5;j++) { cout<<ans[i][j]<<" "; } cout<<endl; } } signed main() { int T = 1; cin>>T; while(T--) { my(); } }
C++ 解法, 执行用时: 12ms, 内存消耗: 520K, 提交时间: 2022-02-20 16:13:42
#include <iostream> #include <algorithm> using namespace std; int cas, a[35], mp[10][10]; void solve() { for (int i = 0; i < 5; i++) for (int j = 0; j < 6; j++) scanf("%d", &mp[i][j]); for (int i = 1; i <= 30; i++) { a[i] = 1 << i, a[i] ^= mp[(i - 1) / 6][(i - 1) % 6]; if (i - 6 >= 1)a[i] ^= 1 << (i - 6); if (i + 6 < 31)a[i] ^= 1 << (i + 6); if (i % 6 != 1)a[i] ^= 1 << (i - 1); if (i % 6 != 0)a[i] ^= 1 << (i + 1); } for (int i = 1; i <= 30; i++) { int cur = i; while (cur <= 30 && !(a[cur] >> i & 1)) cur++; if (cur != i)swap(a[i], a[cur]); for (int j = 1; j <= 30; j++) if (i != j && a[j] >> i & 1)a[j] ^= a[i]; } printf("PUZZLE #%d\n", ++cas); for (int i = 0; i < 5; i++, puts("")) for (int j = 1; j <= 6; j++) printf("%d ", a[i * 6 + j] & 1); } signed main() { int t; cin >> t; while (t--)solve(); return 0; }