• P2040 打开所有的灯


    题目背景

    pmshz在玩一个益(ruo)智(zhi)的小游戏,目的是打开九盏灯所有的灯,这样的游戏难倒了pmshz。。。

    题目描述

    这个灯很奇(fan)怪(ren),点一下就会将这个灯和其周围四盏灯的开关状态全部改变。现在你的任务就是就是告诉pmshz要全部打开这些灯。

    例如 0 1 1

    1 0 0

    1 0 1

    点一下最中间的灯【2,2】就变成了

    0 0 1

    0 1 1

    1 1 1

    再点一下左上角的灯【1,1】就变成了

    1 1 1

    1 1 1

    1 1 1

    达成目标。最少需要2步。

    输出2即可。

    输入输出格式

    输入格式:

     

    九个数字,3*3的格式输入,每两个数字中间只有一个空格,表示灯初始的开关状态。(0表示关,1表示开)

     

    输出格式:

     

    1个整数,表示最少打开所有灯所需要的步数。

    输入输出样例

    输入样例#1: 复制
    0  1  1
    1  0  0
    1  0  1
    输出样例#1: 复制
    2

    说明

    这个题水不水,就看你怎么考虑了。。。。

    思维好题???

    好题。。。

    正如题目所说。。。水不水就看怎么考虑了。

    首先输入完成后判断一下是不是全都为1,此时直接输出0就好了,也省去了往后麻烦的操作。

    dfs里面的变量是操作次数,为什么取9呢?。。。

    怎么解释呢。。。一个一个来,,9次也算很多了。。

    所以超过9次,,就返回上一步再来吧。

    然后我们正常操作,把是0的点和其周围四个点变成和原来不一样的,

    我这里是写的a[i][j]=!a[i][j],就是0,1取反,也可以用1减去a[i][j],得到的也是0,1取反.

    然后每操作一次,就判断一下,是不是全都为1了。

    然后如果还有点为0,那我们就继续操作,操作数+1,继续搜索、。。

    其实这是一个模拟的过程,就看你的模拟思路好不好了。。

    这个还比较好理解,代码:

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    
    int ans=2333;
    int a[4][4];
    int xx[]={-1,0,0,1},yy[]={0,-1,1,0};
    
    bool judge()
    {
    	for(int i=1;i<=3;++i)
    		for(int j=1;j<=3;++j)
    			if(!a[i][j]) return 0;
    	return 1;
    }
    
    void dfs(int x)
    {
    	if(x>9) return ;
    	for(int i=1;i<=3;++i)
    		for(int j=1;j<=3;++j)
    			if(!a[i][j])
    			{
    				a[i][j]=1;
    				for(int k=0;k<4;++k)
    				{
    					int dx=i+xx[k],dy=j+yy[k];
    					a[dx][dy]=!a[dx][dy];
    				}
    				if(judge()) 
    					ans=min(ans,x);
    				dfs(x+1);
    				a[i][j]=0;
    				for(int k=0;k<4;++k)
    				{
    					int dx=i+xx[k],dy=j+yy[k];
    					a[dx][dy]=!a[dx][dy];
    				}
    			}
    }
    
    int main()
    {
    	for(int i=1;i<=3;++i)
    		for(int j=1;j<=3;++j)
    			scanf("%d",&a[i][j]);
    	if(judge()) 
    	{
    		printf("0");
    		return 0;
    	}
    	dfs(1);
    	printf("%d",ans);
    	return 0;
    }

    如果你不开心,那我就把右边这个帅傻子分享给你吧,  

    你看,他这么好看,那么深情的望着你,你还伤心吗?  

    真的!这照片盯上他五秒钟就想笑了。  

    一切都会过去的。 

     

  • 相关阅读:
    硬件接口通信速度
    python socket非阻塞及python队列Queue
    pandaboard用wifi时打不开网页
    pandaboard安装ubuntu14.04系统遇到的问题
    创建ROS工作空间和包
    CAN 和 CANopen的区别和联系
    各种通信方式总汇
    ROS中的CMakeLists.txt
    备忘录模式
    class文件概述
  • 原文地址:https://www.cnblogs.com/Mary-Sue/p/9681162.html
Copyright © 2020-2023  润新知