当前位置: 代码迷 >> C语言 >> 有点错误的点灯游戏的程序,大家帮着调试一下吧
  详细解决方案

有点错误的点灯游戏的程序,大家帮着调试一下吧

热度:210   发布时间:2006-07-10 11:16:51.0
谢谢啊,不过看不明白什么原理啊
----------------解决方案--------------------------------------------------------
对论坛灰心,以被本人删除。

[此贴子已经被作者于2006-7-31 16:50:46编辑过]


----------------解决方案--------------------------------------------------------
怎么错了啊,怎么改,还请指教啊
----------------解决方案--------------------------------------------------------
我觉得没错啊
----------------解决方案--------------------------------------------------------

我不是坐等答案的,所以还希望大家帮忙啊,上面那是二维数组表示的,下面这个是一维数组来表示的,不过这个参考的成分较大,只是想把网上那分改成自己输入N值啊
课题题目:点灯游戏
课题要求:输入:N值
输出:将全部灯点亮的最少步数
课题内容:点灯游戏是一个十分有趣的智力游戏,他的规则是这样的:有一行N行N列的灯,开始时全部是灭的,当你点击其中一盏灯是他的上下左右(若存在的话)状态全部改变,现在要求你在限定的时间内以最少的步数,将全部的灯点亮.

#include"stdio.h"
#include"Conio.h"
main()
{
int row;
int a[100]={0},t,i,j,m,n,k,s,ss,sum;
clrscr();
printf("Please input row :");
scanf("%d",&row);
for(t=row*row-1;t>=0;t--)
for(a[t]=0;a[t]<=1;a[t]++)
{ for(k=0;k<row;k++)
for(i=1;i<row;i++) /* OUT 1 ROW */
for(j=0;j<row;j++)
{ s=a[(i-1)*row+j]; /* 上 */
if(i-2>=0) s+=a[(i-2)*row+j]; /*上上 */
if(i-1>=0) { if(j-1>=0) s+=a[(i-1)*row+j-1]; /*上左 */
if(j+1<row) s+=a[(i-1)*row+j+1]; /*上右 */
}
if(s<=1) a[i*row+j]=1-s; /*self */
else if(s<=3) a[i*row+j]=3-s;
else a[i*row+j]=1;
}
m=row-1;
for(n=0;n<row;n++) /*Judge last row ok? */
{ ss=a[m*row+n]+a[(m-1)*row+n]; /*上 self */
if(n-1>=0) ss+=a[m*row+n-1]; /*左 */
if(n+1<row) ss+=a[m*row+n+1]; /*右 */
if(ss%2==0) continue;
}
if(n==row) { printf("\n OK !\n");
sum=0;
for(i=0;i<n*n;i++)
{ sum+=a[i];
printf("%2d",a[i]);
if((i+1)%n==0)printf("\n");
} printf("dian ji ci shu :%d.\n", sum);
getch();
}
}
}





----------------解决方案--------------------------------------------------------
结果似乎不大正确吧
----------------解决方案--------------------------------------------------------

是啊,就是结果是错的啊


----------------解决方案--------------------------------------------------------
怎么办啊,我想破了脑袋还是没做出来啊,还有2天就交作业了哎
----------------解决方案--------------------------------------------------------
此题思想是:先定义第1行的元素值,1表示被点击了奇数次,灯的状态是亮的,0表示被点击了偶数次,灯的状态是灭的。
然后判断下一行,因为此时第一行的灯状态只受下一行的影响,如果第一行的灯是灭的,则它下一行的就点击,若是亮的,则它下一行的就不点了!然后用循环控制就行了!
----------------解决方案--------------------------------------------------------
我知道错在哪里了,不过不会改正,大家再帮忙想想啊,就是第一步的循环,实际上应该是将第一行的N个元素用嵌套循环。比如如果是五行五列的话,就是
for(a[0]=0;a[0]<=1;a[0]++)
for(a[1]=0;a[1]<=1;a[1]++)
for(a[2]=0;a[2]<=1;a[2]++)
for(a[3]=0;a[3]<=1;a[3]++)
for(a[4]=0;a[4]<=1;a[4]++)
现在是N行N列,也就是要N层嵌套,不知道怎么表示啊,大家再帮一下忙吧!

----------------解决方案--------------------------------------------------------
  相关解决方案