[Gauss]POJ1222 EXTENDED LIGHTS OUT

题意:给一个5*6的矩阵

1代表该位置的灯亮着, 0代表该位置的灯没亮

按某个位置的开关,可以同时改变 该位置 以及 该位置上方、下方、左方、右方, 共五个位置的灯的开、关(1->0, 0->1)

问能否将所有的灯关闭 若能 输出需要按哪些地方; 不能输出-1

 

高斯消元的入门题。

每个位置可以列出一个方程, 列出增广矩阵:

  每个位置可以形成增广矩阵的一行, 每行都有30个系数 分别代表(0到29号灯), 将 可以影响该位置改变的 位置(自己、上、下、左、右)对应的置1, 其余置0

  这样就形成了30*30的系数矩阵。

  将初始状态置入最后一列 就形成了增广矩阵

 

接下来只要解方程组即可。

化成约化阶梯后最后一列即为该方程组的解。

 

P.s. 需要注意的是:因为是矩阵表示的是灯的开关状态,所以解的过程中不应出现0、1以外的其余数字 即 01方程 用异或求解

 

  1 int a[300][300];  // 增广矩阵
  2 int x[300];  //
  3 int free_x[300]; // 标记是否为自由未知量
  4 
  5 int n, m;
  6 void debug()
  7 {
  8     for(int i=0;i<n*n;i++)
  9     {
 10         for(int j=0;j<n*n;j++)
 11             printf("%d ", a[i][j]);
 12         printf("\n");
 13     }
 14 }
 15 
 16 void Gauss(int n, int m) // n个方程 m个未知数 即 n行m+1列
 17 {
 18     //转换为阶梯形式
 19     int col=0, k, num=0;
 20     for(k=0;k<n && col<m;k++, col++)
 21     {//枚举行
 22         int max_r=k;
 23         for(int i=k+1;i<n;i++)//找到第col列元素绝对值最大的那行与第k行交换
 24             if(abs(a[i][col])>abs(a[max_r][col]))
 25                 max_r=i;
 26         if(max_r!=k)// 与第k行交换
 27             for(int j=col;j<m+1;j++)
 28                 swap(a[k][j], a[max_r][j]);
 29         if(!a[k][col])// 说明该col列第k行以下全是0了
 30         {
 31             k--;
 32             free_x[num++]=col;
 33             continue;
 34         }
 35         for(int i=k+1;i<n;i++)// 枚举要删除的行
 36             if(a[i][col])
 37                 for(int j=col;j<m+1;j++)
 38                     a[i][j]^=a[k][j];
 39     }
 40 
 41 //    debug();
 42 //    printf("%d %d\n", col, k);
 43 //
 44 //    for(int i=k;i<n;i++)
 45 //        if(a[i][col])
 46 //            return -1; // 无解
 47 
 48 //    if(k<m)   //m-k为自由未知量个数
 49 //    {
 50 //        int stat=1<<(m-k);
 51 //        int ans=INT_MAX;
 52 //        for(int i=0;i<stat;i++)
 53 //        {
 54 //            int cnt=0;
 55 //            for(int j=0;j<m-k;j++)
 56 //                if(i&(1<<j))
 57 //                {
 58 //                    x[free_x[j]]=1;
 59 //                    cnt++;
 60 //                }
 61 //                else
 62 //                    x[free_x[j]]=0;
 63 //            for(int j=k-1;j>=0;j--)
 64 //            {
 65 //                int tmp;
 66 //                for(tmp=j;tmp<m;tmp++)
 67 //                    if(a[j][tmp])
 68 //                        break;
 69 //                x[tmp]=a[j][m];
 70 //                for(int l=tmp+1;l<m;l++)
 71 //                    if(a[j][l])
 72 //                        x[tmp]^=x[l];
 73 //                cnt+=x[tmp];
 74 //            }
 75 //            if(cnt<ans)
 76 //                ans=cnt;
 77 //        }
 78 //        return ans;
 79 //    }
 80 //
 81     //  唯一解 回代
 82     for(int i=m-1;i>=0;i--)
 83     {
 84         x[i]=a[i][m];
 85         for(int j=i+1;j<m;j++)
 86             x[i]^=(a[i][j] && x[j]);
 87     }
 88 //    int ans=0;
 89 //    for(int i=0;i<n*n;i++)
 90 //        ans+=x[i];
 91 //    return ans;
 92 }
 93 
 94 
 95 void init()
 96 {
 97     n=5, m=6;
 98     memset(a, 0, sizeof(a));
 99     memset(x, 0, sizeof(x));
100     for(int i=0;i<n;i++)
101         for(int j=0;j<m;j++)
102         {
103             int t=i*m+j;
104             a[t][t]=1;
105             if(i>0)
106                 a[(i-1)*m+j][t]=1;
107             if(i<n-1)
108                 a[(i+1)*m+j][t]=1;
109             if(j>0)
110                 a[i*m+j-1][t]=1;
111             if(j<m-1)
112                 a[i*m+j+1][t]=1;
113         }
114 }
115 
116 int main()
117 {
118     int t, ca=1;
119     scanf("%d", &t);
120     while(t--)
121     {
122         init();
123         for(int i=0;i<n*m;i++)
124             scanf("%d", &a[i][n*m]);
125         printf("PUZZLE #%d\n", ca++);
126         Gauss(n*m, n*m);
127         for(int i=0;i<n;i++)
128             for(int j=0;j<m;j++)
129             {
130                 printf("%d", x[i*m+j]);
131                 if(j==5)
132                     printf("\n");
133                 else
134                     printf(" ");
135             }
136     }
137     return 0;
138 }
POJ 1222

 

转载于:https://www.cnblogs.com/Empress/p/4156234.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值