用C语言完成在右侧编辑器补充代码,输入五行,每行五个数值(0或1),表示当前格子的状态。输出对于输入数据中对应的当前状态最少需要几步才能使25个格子都变亮。如果不能使25个格子都变亮,输出-1。尽量提高计算效率。
时间: 2024-06-05 15:06:07 浏览: 82
#include<stdio.h>
#include<string.h>
#define INF 0x3f3f3f3f
int map[7][7],dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int ans=INF;
void dfs(int step,int x,int y){
//如果当前步数大于等于已知答案,直接返回
if(step>=ans) return;
//如果当前所有格子都亮了,更新答案
if(x>5) {
ans=step;
return;
}
//如果当前格子已经亮了,直接访问下一个格子
if(map[x][y]) {
y++;
if(y>5) x++,y=1;
dfs(step,x,y);
return;
}
//枚举当前格子的状态
for(int i=0;i<4;i++){
int nx=x+dir[i][0],ny=y+dir[i][1];
if(nx>=1&&ny>=1&&nx<=5&&ny<=5){
map[nx][ny]^=1;
}
}
//递归访问下一个格子
y++;
if(y>5) x++,y=1;
dfs(step+1,x,y);
//回溯,恢复当前格子的状态
for(int i=0;i<4;i++){
int nx=x+dir[i][0],ny=y+dir[i][1];
if(nx>=1&&ny>=1&&nx<=5&&ny<=5){
map[nx][ny]^=1;
}
}
}
int main(){
for(int i=1;i<=5;i++){
for(int j=1;j<=5;j++){
scanf("%d",&map[i][j]);
}
}
dfs(0,1,1);
if(ans==INF) printf("-1\n");
else printf("%d\n",ans);
return 0;
}
阅读全文