二维数组变换问题

FARKY 2002-02-09 10:29:14
有一个N*N的二位数组,其基类型为Boolean,初始值全部为False
按照以下规则对该数组中的元素作NOT运算
若将元素(X,Y)作NOT运算,则元素(X+1,Y),(X-1,Y),(X,Y+1),(X,Y-1)的值也必须相应的作NOT运算。求出使二位数组的值全部变为True的最快方法。
输入N = 3则输出:
(2,2)->(1,1)->(1,3)->(3,1)->(3,3)
...全文
38 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wolfqixianfeng 2002-03-03
  • 打赏
  • 举报
回复
好象是一个叫作点灯的游戏 与此类似
FARKY 2002-02-22
  • 打赏
  • 举报
回复
如何列方程?
mathe 2002-02-22
  • 打赏
  • 举报
回复
打个补丁,处理距阵不可逆时。

#include <stdio.h>

#define MAXN 50
#define MAXTRIX_SIZE (MAXN*MAXN)

char m[MAXTRIX_SIZE][MAXTRIX_SIZE];
char b[MAXTRIX_SIZE];
char r[MAXTRIX_SIZE];
int index[MAXTRIX_SIZE];

int main(){
int n;
int i,j,k;
int last;
char swap;
int iswap;
scanf("%d",&n);
if(n>MAXN||n<=0){
printf("%d out of range\n",n);
return -1;
}
last=n*n;
for(i=0;i<last;++i)index[i]=i;
//initialize data
for(i=0;i<n*n;++i){
m[i][i]=1;
if(i>=n)m[i][i-n]=1;
if(i%n!=0)m[i][i-1]=1;
if(i%n!=(n-1))m[i][i+1]=1;
if(i<n*n-n)m[i][i+n]=1;
b[i]=1;
}
for(i=0;i<last;++i){
for(j=i;j<n*n;++j){
if(m[j][i])
break;
}
if(j==last){
iswap=index[--last];
index[last]=index[i];
index[i]=iswap;
for(k=0;k<n*n;++k){
m[k][i]=m[k][last];
m[k][last]=0;
}
}else{
for(k=i;k<last;++k){
swap=m[i][k];
m[i][k]=m[j][k];
m[j][k]=swap;
}

swap=b[i];
b[i]=b[j];
b[j]=swap;

for(j=i+1;j<n*n;++j){
if(m[j][i]){
b[j]^=b[i];
for(k=i;k<last;++k)
m[j][k]^=m[i][k];
}
}
}
}
if(last<n*n){
fprintf(stderr,"Matrix not invertible\n");
for(i=last;i<n*n;++i){
if(b[i]){
fprintf(stderr,"Cannot find result\n");
return -1;
}
}
}
for(i=last-1;i>=0;--i){
for(j=0;j<i;++j){
if(m[j][i]){
b[j]^=b[i];
m[j][i]=0;
}
}
}
iswap=0;
for(i=0,j=0;j<n;++j){
for(k=0;k<n;++k,++i){
if(b[index[i]])iswap++;
printf("%1d",(int)b[index[i]]);
}
printf("\n");
}

printf("Total %d operation\n",iswap);
return 0;
}
mathe 2002-02-22
  • 打赏
  • 举报
回复
对于N<=50看来还都可以忍受

#include <stdio.h>
#include <memory.h>
#include <malloc.h>

char **m;
char *b;

int main(){
int n;
int i,j,k;
int last;
char swap;
scanf("%d",&n);
if(n<=0){
printf("%d out of range\n",n);
return -1;
}
last=n*n;
m=(char **)malloc(sizeof(char*)*last+last*last*sizeof(char));
b=(char *)malloc(sizeof(char)*last);
if(m==NULL||b==NULL){
printf("Out of memory\n");
return -1;
}
m[0]=(char *)(m+last);
for(i=1;i<last;++i){
m[i]=m[i-1]+last;
}
memset(m[0],0,sizeof(char)*last*last);
//initialize data
for(i=0;i<last ;++i){
m[i][i]=1;
if(i>=n)m[i][i-n]=1;
if(i%n!=0)m[i][i-1]=1;
if(i%n!=(n-1))m[i][i+1]=1;
if(i<n*n-n)m[i][i+n]=1;
b[i]=1;
}
for(i=0;i<last;++i){
for(j=i;j<last;++j){
if(m[j][i])
break;
}
if(j==last){
printf("Matrix not invertible\n");
return -1;
}else{
if(i!=j){
for(k=i;k<last;++k){
swap=m[i][k];
m[i][k]=m[j][k];
m[j][k]=swap;
}

swap=b[i];
b[i]=b[j];
b[j]=swap;
}

for(j=i+1;j<last;++j){
if(m[j][i]){
b[j]^=b[i];
for(k=i;k<last;++k)
m[j][k]^=m[i][k];
}
}
}
}
if(last<n*n){
printf("Maxtrix not invertible\n");
}
for(i=last-1;i>=0;--i){
for(j=0;j<i;++j){
if(m[j][i]){
b[j]^=b[i];
m[j][i]=0;
}
}
}
for(i=0,j=0;j<n;++j){
for(k=0;k<n;++k,++i){
printf("%1d",(int)b[i]);
}
printf("\n");
}
return 0;
}
mathe 2002-02-22
  • 打赏
  • 举报
回复
不过解方程需要花费O(N^6)的时间(方程的矩阵为N^2阶)。
不过这个矩阵是稀疏距阵(每一行最多5个1),应该有更快的方法。
而且由于解是唯一的,如果能得出理论解不是更好?我认为应该有可以在
O(N^4)之内解决问题的方法。
intfree 2002-02-20
  • 打赏
  • 举报
回复
解方程
FARKY 2002-02-17
  • 打赏
  • 举报
回复
没人了?Up一下
wanbaocheng 2002-02-14
  • 打赏
  • 举报
回复
是错了,我事后就发现了。比如N=4时就有解的。不过我会努力的!
FARKY 2002-02-13
  • 打赏
  • 举报
回复
猜想不成立,N = 10的时候有解的。
FARKY 2002-02-12
  • 打赏
  • 举报
回复
没人吗?
wanbaocheng 2002-02-12
  • 打赏
  • 举报
回复
经过一番研究,虽然还没有完全找到问题的解。但是到可以给出一个存在性的猜想。我们发现当N为大于等于4的偶数时,无解。比如N=4时你可以试一试。除此之外,据估计应该都有解。
DaNiao 2002-02-09
  • 打赏
  • 举报
回复
我突然发现初始都是false,似乎题目比我想的还要简单一点。

DaNiao 2002-02-09
  • 打赏
  • 举报
回复
碰到类似的问法,我总会想到抽象代数,好象群呀什么什么的
DaNiao 2002-02-09
  • 打赏
  • 举报
回复
什么游戏压,我好象没玩过
回溯搜索就是盲目搜索吧
当然是放之四海而皆准,但时间复杂度实在让人不能忍受,
我对算法的认识是:如果没找到比盲目搜索更好的算法,就不算是找到了算法
starfish 2002-02-09
  • 打赏
  • 举报
回复
这好像是文曲星上的游戏
我的初步想法就是回溯搜索
Smile_Tiger 2002-02-09
  • 打赏
  • 举报
回复
喔,这不就是那个游戏吗?

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧