计算机编程就是个跑循环干体力活的。不是算术解、不一定非得动脑筋找窍门。
理解“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; } }