计算机编程就是个跑循环干体力活的。不是算术解、不一定非得动脑筋找窍门。
理解“202可以控制....个房间的灯”这句话应该不难。
就题中的例子来说你就建立数组【N】【N】={0},每次读一个房间号,修改一下数组,并且遍历数组统计当时有多少亮灯。
读完M个房间号,输出统计得到的Max就行了。。。

程序代码:#include <stdio.h>
static int X,Y,T=1;
int main()
{
void begin(char a[][12]);
char a[12][12]=
{
"############",
"#** **#",
"#* *#",
"# #",
"# #",
"# o #",
"# #",
"# #",
"# #",
"#* *#",
"#** **#",
"############",
};
begin(a);
printf("\n恭喜过关\n");
}
void begin(char a[][12])
{
void run(char a[][12],char ch);
int i,j,win;
char ch;
while (1)
{
for (i=0,win=1;i<=11&&T;i++,printf("\n"))
for(j=0;j<=11;printf("%c",a[i][j]),j++)
{
if (a[i][j]=='o'||a[i][j]=='$')
{
X=i;
Y=j;
}
if (a[i][j]=='*')
win=0;
}
if (win&&T)break;
switch (ch=getch())
{
case 'w':
case 's':
case 'a':
case 'd':
case ' ':
run(a,ch);
break;
default:T=0;
}
}
}
void run(char a[][12],char ch)
{
int i;
int b[4],c[4];
int u,v;
u=X,v=Y;
b[0]=X-1;c[0]=Y;
b[1]=X+1;c[1]=Y;
b[2]=X;c[2]=Y-1;
b[3]=X;c[3]=Y+1;
switch(ch)
{
case'w':u=X-1;v=Y;break;
case's':u=X+1;v=Y;break;
case'a':u=X;v=Y-1;break;
case'd':u=X;v=Y+1;break;
}
if (a[u][v]!='#')
{
if (a[u][v]==' ')
a[u][v]='0';
if (a[u][v]=='*')
a[u][v]='1';
if (a[X][Y]=='o')
a[X][Y]='0';
if (a[X][Y]=='$')
a[X][Y]='1';
system("cls");
T=1;
}
else T=0;
switch(a[u][v])
{
case'0':a[u][v]='o';break;
case'1':a[u][v]='$';break;
}
switch(a[X][Y])
{
case'0':a[X][Y]=' ';break;
case'1':a[X][Y]='*';break;
}
if (ch==' ')
{
for (i=0;i<=3;i++)
{
if (a[b[i]][c[i]]!='#')
if (a[b[i]][c[i]]==' ')
a[b[i]][c[i]]='*';
else if (a[b[i]][c[i]]='*')
a[b[i]][c[i]]=' ';
}
if (a[X][Y]=='o')
a[X][Y]='$';
else a[X][Y]='o';
}
if (T)
{
X=u;
Y=v;
}
}
