社区
数据结构与算法
帖子详情
二维数组变换问题
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
打赏
收藏
二维数组变换问题
有一个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)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
喔,这不就是那个游戏吗?
从三维数组中提取出任意二维的数据,并保存在新的二维矩阵中
程序功能:从三维数组中提取出任意二维的数据,并保存在新的二维矩阵中,且能所以
变换
顺序。
二维数组
降维为一维数组
// // main.cpp //
二维数组
// 1.一个
二维数组
就像是若干个相同的数组放在一起,这对于存储多组数据非常有用。 // 2.一维数组(One-Dimension Array) // 3.
二维数组
(Two-Dimension Arrays) // 4.处理
二维数组
的时候直接当作一维数组就可以了每一行都是一个一维数组。 // 5.
二维数组
在存储的时候,是按照一行...
Java一维数组与
二维数组
的转换
准备 现有一个一维数组:{1,2,3,4,5,6,7,8,9} 转为 3*3 的
二维数组
: { 1,2,3 4,5,6 7,8,9 } 我们不难看出: 一维数组第1个元素在数组中为 arr[0][0], 一维数组第3个元素在数组中为 arr[0][2], 一维数组第4个元素在数组中为 arr[1][0], 由于第(n+1)个元素下标为n,为此我们可以得出结论: 一维数组的第n个元素,在
二维数组
中表示为:arr[n / col][n % col] 题目引
关于
二维数组
二维数组
:其实就是一个由行和列的表格,我们也称之为矩阵。(矩阵一定是一个
二维数组
,但
二维数组
不一定是矩阵)换言之,
二维数组
也可以看做是由多个一维数组组成 我们在这个矩阵中访问元素的话,是根据该元素的行角标和列角标所决定的 数组的创建是在堆中 无论是二维还是多维数组,其本身就是一个一维数组。尤其对于
二维数组
而言,无非就是一个一维数组,只不过,该一维数组的每一个元素,又是一个一维数组 举...
VBA中的一维数组,
二维数组
排序
问题
【代码】VBA中的一维数组,
二维数组
排序
问题
。
数据结构与算法
33,028
社区成员
35,337
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章