POJ 2965 The Pilots Brothers' refrigerator(反转)

本文介绍了一种解决4*4矩阵状态转换问题的方法,即如何通过最少的操作次数将矩阵中所有的元素从初始状态变为全开的状态。文章详细阐述了算法原理及实现步骤,并提供了示例输入输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description
4*4矩阵,矩阵上每个元素都有两种状态开和关,给定初始状态,和状态转移,求从初始状态到目标状态(所有元素都是开状态)的最小步骤数以及步骤(每操作一个开关,此开关所在行列所有开关均被操作)
Input
一个4*4矩阵表示开关状态,+表示关,-表示开
Output
输出从初始状态到目标状态的最小步骤数以及步骤
Sample Input
- + - -
- - - -
- - - -
- + - -
Sample Output
6
1 1
1 3
1 4
4 1
4 3
4 4
Solution
要使一个为+变为-,必须其相应的行和列的操作数为奇数;可以证明,如果+位置对应的行和列上每一个位置都进行一次操作,则整个图只有这一+位置的符号改变,其余都不会改变.
设置一个4*4的整型数组,初值为零,用于记录每个点的操作数,那么在每个+上的行和列的的位置都加1,得到结果模2(因为一个点进行偶数次操作的效果和没进行操作一样),然后计算整型数组中1的个数即为操作数,1的位置为要操作的位置(其他原来操作数为偶数的因为操作并不发生效果,因此不进行操作)
按以上步骤使数组中值都为‘-’
Code

#include<stdio.h>
int main()
{
    int i,j,k,open[4][4],ii[16],jj[16],min=0;
    char oo[4][5];
    for(i=0;i<4;i++)
        for(j=0;j<5;j++)
            scanf("%c",&oo[i][j]);
    for(i=0;i<4;i++)//初始化 
        for(j=0;j<4;j++)
            open[i][j]=0;
    for(i=0;i<4;i++)
        for(j=0;j<4;j++)
        {
            if(oo[i][j]=='+')//遇到+则对其所在行列所有开关进行操作 
            {
                open[i][j]=!open[i][j];
                for(k=0;k<4;k++)
                {
                    open[k][j]=!open[k][j];
                    open[i][k]=!open[i][k];
                }
            }
        }
    for(i=0;i<4;i++)
        for(j=0;j<4;j++)
        {
            if(open[i][j]==1)//记录步骤 
            {
                ii[min]=i+1;
                jj[min]=j+1;
                min++;//步骤数加一 
            }
        }   
    printf("%d\n",min);
    for(i=0;i<min;i++)
        printf("%d %d\n",ii[i],jj[i]);  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值