P10449 费解的开关题目描述你玩过“拉灯”游戏吗25 2525盏灯排成一个5 × 5 5 \times 55×5的方形。每一个灯都有一个开关游戏者可以改变它的状态。每一步游戏者可以改变某一个灯的状态。游戏者改变一个灯的状态会产生连锁反应和这个灯上下左右相邻的灯也要相应地改变其状态。我们用数字1 11表示一盏开着的灯用数字0 00表示关着的灯。下面这种状态10111 01101 10111 10000 11011在改变了最左上角的灯的状态后将变成01111 11101 10111 10000 11011再改变它正中间的灯后状态将变成01111 11001 11001 10100 11011给定一些游戏的初始状态编写程序判断游戏者是否可能在6 66步以内使所有的灯都变亮。输入格式第一行输入正整数n nn代表数据中共有n nn个待解决的游戏初始状态。以下若干行数据分为n nn组每组数据有5 55行每行5 55个字符。每组数据描述了一个游戏的初始状态。各组数据间用一个空行分隔。输出格式一共输出n nn行数据每行有一个小于等于6 66的整数它表示对于输入数据中对应的游戏状态最少需要几步才能使所有灯变亮。对于某一个游戏初始状态若6 66步以内无法使所有灯变亮则输出-1。输入输出样例 #1输入 #13 00111 01011 10001 11010 11100 11101 11101 11110 11111 11111 01111 11111 11111 11111 11111输出 #13 2 -1说明/提示测试数据满足0 n ≤ 500 0 n \le 5000n≤500。C实现#includebits/stdc.husingnamespacestd;queueintq;intans,x;shortl[126];//省空间intqf(intx,inty){//改变灯的状态x^(1y);if(y4)x^(1(y-5));if(y20)x^(1y5);if(y%5!0)x^(1y-1);if(y%54)x^(1(y1));returnx;}voidbfs(){memset(l,-1,sizeofl);q.push((125)-1);l[(125)-1]0;while(!q.empty()){inttq.front();q.pop();if(l[t]6)break;for(inti0;i25;i){if(l[qf(t,i)]-1){q.push(qf(t,i));l[qf(t,i)]l[t]1;}}}return;}signedmain(){intn;cinn;bfs();while(n--){intx0;for(inti0;i5;i){for(intj0;j5;j){intt;scanf(%1d,t);if(t)xx|(1(i*5j));}}coutl[x]endl;}return0;//好习惯}后续接下来我会不断用C来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现记录日常的编程生活、比赛心得感兴趣的请关注我后续将继续分享相关内容