求一个算法。15分钟内解出来你就可以进google了

vovo2000 2018-12-10 07:04:09
给定一个数组, 里面的值只有0和.
如果改变一个值的话,这个值的上下左右的值也会发生发转。

比如
(切换行2、列2的值)
1011 1111
0001 - > 1111
1011 1111

(切换行1、列2的值)
0001 1111
1011 - > 1111
1111 1111

一次切换行1、列4→行2、列3→行2、列4→行3、列4)
1111 1100 1110 1111 1111
1011 - > 1010 - > 1101 - > 1110 - > 1111
1111 1111 1101 1100 1111


----------问题-------------------
给出一个N行M列的数组
求最少需要多少次才能把数组里面的值,全部切换成1

N,M都是大于1的正整数。

数组是随机的,N,M和里面的1和0的值也是随机。
有可能这样
11111
10111
11111
11111

也有可能这样
110111
101110
001101
000000

期待大神出现。


...全文
2069 58 打赏 收藏 转发到动态 举报
写回复
用AI写文章
58 条回复
切换为时间正序
请发表友善的回复…
发表回复
失落的神庙 2018-12-14
  • 打赏
  • 举报
回复
01
11

这个怎么解。
张天星 2018-12-14
  • 打赏
  • 举报
回复
引用 50 楼 秋天之落叶 的回复:
[quote=引用 46 楼 qq_37790902 的回复:]
感觉有点像扫雷的算法。。。

同感,就是规定了只能是所扫的雷的邻居变化。
但是,我想不明白的,如何判断从哪一行那一列开始下手?如果都从第一行第一列下手,那就没有最少几次和概念了。
晕菜中......[/quote]
扫雷是点击之后才能看到周围,所以从第一行第一列下手。。。
而楼主这个题目,重点大概就是算出从哪里下手比较快了。
xuzuning 2018-12-14
  • 打赏
  • 举报
回复
xuzuning 2018-12-14
  • 打赏
  • 举报
回复
实践证明:置于反转的位置有关,而与次序无关
xuzuning 2018-12-14
  • 打赏
  • 举报
回复
0 和 1 只在一念之差

从来就没有看到一定又解的证明

引用 59 楼 失落的神庙 的回复:
[quote=引用 57 楼 xuzuning 的回复:]
[quote=引用 56 楼 失落的神庙 的回复:]
01
11

这个怎么解。

翻转右下角,按变换规则(上下左右各一个翻转)变成:
00
00

借此发点感慨
如果这是十年前,那么一定会有无数的求解方法出现(网上搜一下 灭(点)灯算法 就是证据)
且不说算法是否正确,起码参与的热情是存在的
现时的人实在是太现实了,不见兔子不撒鹰,.......[/quote]

可是题目是都变成1,所以觉得有可能无解。
[/quote]
失落的神庙 2018-12-14
  • 打赏
  • 举报
回复
引用 57 楼 xuzuning 的回复:
[quote=引用 56 楼 失落的神庙 的回复:]
01
11

这个怎么解。

翻转右下角,按变换规则(上下左右各一个翻转)变成:
00
00

借此发点感慨
如果这是十年前,那么一定会有无数的求解方法出现(网上搜一下 灭(点)灯算法 就是证据)
且不说算法是否正确,起码参与的热情是存在的
现时的人实在是太现实了,不见兔子不撒鹰,.......[/quote]

可是题目是都变成1,所以觉得有可能无解。
xuzuning 2018-12-14
  • 打赏
  • 举报
回复
引用 56 楼 失落的神庙 的回复:
01
11

这个怎么解。
你可以自己体会一下


黑色块全部变成白色的,只能切换那些有红色点的块
xuzuning 2018-12-14
  • 打赏
  • 举报
回复
引用 56 楼 失落的神庙 的回复:
01
11

这个怎么解。

翻转右下角,按变换规则(上下左右各一个翻转)变成:
00
00

借此发点感慨
如果这是十年前,那么一定会有无数的求解方法出现(网上搜一下 灭(点)灯算法 就是证据)
且不说算法是否正确,起码参与的热情是存在的
现时的人实在是太现实了,不见兔子不撒鹰,.......
xuzuning 2018-12-13
  • 打赏
  • 举报
回复


xuzuning 2018-12-13
  • 打赏
  • 举报
回复
15分钟连看懂题目,形成初步方案都不够,跟不要说比较方案的优劣了
即便你平时有所积淀,在15分钟内默写出无误的代码也是不够的(虽然 100 行也并不算多)

在网上搜索了几天,对比了多种方案。感觉最靠谱的是 用线性方程组求解

xm265 2018-12-12
  • 打赏
  • 举报
回复
题目看不懂~ 晕菜
worldy 2018-12-12
  • 打赏
  • 举报
回复
引用 41 楼 射手座cl 的回复:
20楼正解,因为随机生成的矩阵全为1的概率大于0,所以当生成的矩阵全为1是,矩阵只需变换0次,所以最少需要0次才能把数组里面的值,全部切换成1


应该一样,比如


11111111
11111111
11111110

射手座cl 2018-12-12
  • 打赏
  • 举报
回复
20楼正解,因为随机生成的矩阵全为1的概率大于0,所以当生成的矩阵全为1是,矩阵只需变换0次,所以最少需要0次才能把数组里面的值,全部切换成1
射手座cl 2018-12-12
  • 打赏
  • 举报
回复
引用 39 楼 worldy 的回复:
[quote=引用 22 楼 weixin_43960985 的回复:]
真的能全变成1吗
如果只有一行
01
全是1的情况就办不到了


我也感觉可能很多情况无解,比如,单行11111110,这样要如何变换?[/quote]


题目行列都大于1
worldy 2018-12-12
  • 打赏
  • 举报
回复
引用 22 楼 weixin_43960985 的回复:
真的能全变成1吗
如果只有一行
01
全是1的情况就办不到了


我也感觉可能很多情况无解,比如,单行11111110,这样要如何变换?
HelloKitty_Gaga 2018-12-12
  • 打赏
  • 举报
回复
引用 16 楼 水边2 的回复:
没看懂难度在哪里?
Google不会这么弱智吧


static void Main(string[] args)
{
// 初始化
var arr = new int[10][];
for (var i = 0; i < arr.Length; i++)
{
arr[i] = new int[10];
for (var j = 0; j < arr[i].Length; j++)
arr[i][j] = 1;
}
Print(arr);
Change(arr, 0, 2);
Print(arr);
Console.Read();
}

static void Print(int[][] arr)
{
for (var i = 0; i < arr.Length; i++)
{
for (var j = 0; j < arr[i].Length; j++)
Console.Write(arr[i][j] + " ");
Console.WriteLine();
}
Console.WriteLine("==========================");
}

static void Change(int[][] arr, int row, int col)
{
// 0 1 切换
arr[row][col] = Math.Abs(arr[row][col] - 1);
// 改左边
if (col > 0)
arr[row][col - 1] = Math.Abs(arr[row][col - 1] - 1);
// 改右边
if (col < arr[0].Length - 1)
arr[row][col + 1] = Math.Abs(arr[row][col + 1] - 1);
// 改上边
if (row > 0)
arr[row - 1][col] = Math.Abs(arr[row - 1][col] - 1);
// 改下边
if (row < arr.Length - 1)
arr[row + 1][col] = Math.Abs(arr[row + 1][col] - 1);
}




·
你可能没看懂题目的意思...
vovo2000 2018-12-12
  • 打赏
  • 举报
回复
真烧脑。马上要面试。 现在还不知道怎么做,不知道会不会问我的思路。我连思路都没有。哭
秋天之落叶 2018-12-12
  • 打赏
  • 举报
回复
引用 46 楼 qq_37790902 的回复:
感觉有点像扫雷的算法。。。

同感,就是规定了只能是所扫的雷的邻居变化。
但是,我想不明白的,如何判断从哪一行那一列开始下手?如果都从第一行第一列下手,那就没有最少几次和概念了。
晕菜中......
qq_42274941 2018-12-12
  • 打赏
  • 举报
回复
(其实就是上面某个网站的)一行一行的灭,只要确定第一行,后面就确定了。第一行按下的方式有2的列数的次方种,假如四列,1111,1表示按下0000,0001....总共16种被按下的方式。第一行按下方式被确定了,下面就是第二行,第二行的方式就是把第一行的等全部灭了。假如第一次按下的结果是1000,那么第二行只需按下第一个 ,这样第一行全灭,下来是第三行...一直到最后一行,当最后一行全部灭了的情况下,这就表示这种按得方式是正确的,如果不是,重头循环第二种按下的方式,直到最后一行全灭。 我用PHP循环得出的方式都是一种,当然如果列数太少可能会无解(这种方式只是每个灯只能按一次)。
qq_42274941 2018-12-12
  • 打赏
  • 举报
回复
之前看题不认真说错了,后来研究一下,c#不会写,当时为了做上面网页中那个小游戏,不会qt因此用的php和js写得,算法自然用的php,代码在公司电脑里。我就想说一下大致的思路。
加载更多回复(38)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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