领券的网站怎么建设wordpress 国人主题

当前位置: 首页 > news >正文

领券的网站怎么建设,wordpress 国人主题,河南艾特 网站建设公司,顺德网站#x1f331;博客主页#xff1a;大寄一场. #x1f331;系列专栏#xff1a; 算法 #x1f618;博客制作不易欢迎各位#x1f44d;点赞⭐收藏➕关注 题目#xff1a;费解的开关 你玩过“拉灯”游戏吗#xff1f; 25盏灯排成一个 55 的方形。 每一个灯都有一个开关博客主页大寄一场. 系列专栏 算法 博客制作不易欢迎各位点赞⭐收藏➕关注 题目费解的开关 你玩过“拉灯”游戏吗 25盏灯排成一个 5×5 的方形。 每一个灯都有一个开关游戏者可以改变它的状态。 每一步游戏者可以改变某一个灯的状态。 游戏者改变一个灯的状态会产生连锁反应和这个灯上下左右相邻的灯也要相应地改变其状态。 我们用数字 1 表示一盏开着的灯用数字 0 表示关着的灯。 下面这种状态 10111 01101 10111 10000 11011 在改变了最左上角的灯的状态后将变成 01111 11101 10111 10000 11011 再改变它正中间的灯后状态将变成 01111 11001 11001 10100 11011 给定一些游戏的初始状态编写程序判断游戏者是否可能在 6 步以内使所有的灯都变亮。 输入格式 第一行输入正整数 n代表数据中共有 n 个待解决的游戏初始状态。 以下若干行数据分为 n 组每组数据有 5 行每行 5个字符。 每组数据描述了一个游戏的初始状态。 各组数据间用一个空行分隔。 输出格式 一共输出 n 行数据每行有一个小于等于 6的整数它表示对于输入数据中对应的游戏状态最少需要几步才能使所有灯变亮。 对于某一个游戏初始状态若 6步以内无法使所有灯变亮则输出 −1。 数据范围 0n≤500 输入样例 3 00111 01011 10001 11010 11100 11101 11101 11110 11111 11111 01111 11111 11111 11111 11111 输出样例 3 2 -1 例如 00111 01011 10001 11010 11100  则最少需要3步 算法思路 我们枚举第一行的点击方法(按或不按共2^532种完成第一行的点击后固定第一行 从第一行开始递推若最后一行有0暗说明这种方式无解。在所有合法的点击方式中取点击次数最少的就是答案。若点击次数大于6还无法使所有灯变亮则输出 −1。时间复杂度32*25*5*500 200 000 000  对第一行操作有32种可能 * 25个格子 * 每一次操作都要改变5个灯的状态 * 最多读入的时候可能有500次light矩阵最关键的两点 1.要使得步数最少则每一个位置最多只会被点击一次 2.每一行开关的操作被前一行灯的亮灭所操作。 比如说 上图若固定第一行则第二行只能操作第二格。 所以说第一行的固定可以决定整个棋盘的操作。 那么我们如何枚举第一行的操作呢 若用0 不操作1操作来表示 举个栗子
1 1 1 1 1-用10进制表示为31 0 0 0 0 0-用10进制表示为0 即第一行的操作可以用 0~2^5 -131来对应 tips:这里如何判断op的二进制表示的第k位是否为1 opk1 再举个栗子   26-1 1 0 1 0 位数分别为 4 3 2 1 0   判断它的第一位是否为1 1 1 0 1 01  -1 1 0 1 1 1 0 111运算 两个位都为1时结果为1。 for (int op 0; op 32; op )//枚举第一行的操作{int step 0;for (int i 0; i 5; i )if (op i 1){step ;turn(0, i);}} 操作五个灯偏移量 turnx,y int dx[5] {-1, 0, 1, 0, 0}, dy[5] {0, 1, 0, -1, 0};//偏移量 void turn(int x, int y) {for (int i 0; i 5; i ){int a x dx[i], b y dy[i];if (a 0 || a 5 || b 0 || b 5)//判断是否出界continue; g[a][b] ^ 1;//‘0’的ascall码为48二进制表示110000‘1’的ascall码为49二进制表示110001} } 判断最后一行灯的情况 bool dark false;//判断最后一行是否有暗有则方案无解for (int i 0; i 5; i )if (g[4][i] 0){dark true;break;}if (!dark) res min(res, step);//无则记录最小步数 完整代码  #include cstdio #include cstring #include iostream #include algorithm using namespace std; const int N 6;// /‘0’ char g[N][N], backup[N][N]; int dx[5] {-1, 0, 1, 0, 0}, dy[5] {0, 1, 0, -1, 0};//偏移量void turn(int x, int y) {for (int i 0; i 5; i ){int a x dx[i], b y dy[i];if (a 0 || a 5 || b 0 || b 5)//判断是否出界continue; g[a][b] ^ 1;//‘0’的ascall码为48二进制表示110000‘1’的ascall码为49二进制表示110001} }int main() {int T;cin T;while (T – )//T组测试数据{for (int i 0; i 5; i ) //打印棋盘5*5cin g[i];int res 10;for (int op 0; op 32; op )//枚举第一行的操作{memcpy(backup, g, sizeof g);int step 0;for (int i 0; i 5; i )if (op i 1){step ;turn(0, i);}for (int i 0; i 4; i )for (int j 0; j 5; j )if (g[i][j] 0){step ;turn(i 1, j);}bool dark false;//判断最后一行是否有暗有则方案无解for (int i 0; i 5; i )if (g[4][i] 0){dark true;break;}if (!dark) res min(res, step);memcpy(g, backup, sizeof g);}if (res 6) res -1;cout res endl;}return 0; } 题目翻硬币  小明正在玩一个“翻硬币”的游戏。 桌上放着排成一排的若干硬币。我们用 * 表示正面用 o 表示反面是小写字母不是零。 比如可能情形是oo*oooo 如果同时翻转左边的两个硬币则变为oooo***oooo 现在小明的问题是如果已知了初始状态和要达到的目标状态每次只能同时翻转相邻的两个硬币,那么对特定的局面最少要翻动多少次呢 我们约定把翻动相邻的两个硬币叫做一步操作。 输入格式 两行等长的字符串分别表示初始状态和要达到的目标状态。 输出格式 一个整数表示最小操作步数 数据范围 输入字符串的长度均不超过100。 数据保证答案一定有解。 输入样例1 ********** o*o*输出样例1 5输入样例2 *ooo** *o*oo**输出样例2 1 从左开始遍历一次翻转相邻的俩个 关键的两点 1.操作顺序无影响 2.最多一次 翻转操作 void turn(int i) {if(start[i]) start[i]o;else start[i];} 完整代码 #includecstdio #includecstring #includeiostream #includealgorithm using namespace std;const int N110;//输入字符串的长度均不超过100。 int n; char start[N],ed[N];//两行等长的字符串分别表示初始状态和要达到的目标状态。void turn(int i) {if(start[i]) start[i]o;else start[i]*;}int main() {cinstarted;nstrlen(start);int res0;for(int i0;in-1;i)//从左开始遍历if(start[i]!ed[i]) //判断初始状态和目标状态是否相同{turn(i),turn(i1); //不同则翻转相邻俩个硬币res;}coutresendl; return 0;
} 看到这里的话感谢各位佬的支持