题解 | #Flip Game#

技巧:
    二进制串模型枚举尝试
思路:
    二进制串模型枚举尝试
实现:
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws Exception {
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);
        int[][] arr = new int[4][4];

        for (int i = 0; i < 4; i++) {
            char[] chars = br.readLine().toCharArray();
            for (int j = 0; j < chars.length; j++) {
                if ('b' == chars[j]) {
                    arr[i][j] = 1;
                }
            }
        }
        // ====================================================
        int ans = 0x7fffffff;
        int tryModel = 1 << 16;
        for (int i = 0; i < tryModel; i++) {
            if (allSame(flip(arr, i))) {
                int count = 0;
                int x = i;
                while (x != 0) {
                    if ((x & 1) == 1) {
                        count++;
                    }
                    x >>= 1;
                }
                ans = count < ans ? count : ans;
            }
        }

        if (ans == 0x7fffffff) {
            System.out.println("Impossible");
        } else {
            System.out.println(ans);
        }
    }

    static boolean allSame(int[][] tmp) {
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                if (tmp[i][j] != tmp[0][0]) {
                    return false;
                }
            }
        }
        return true;
    }

    static int[][] flip(int[][] arr, int k) {
        int[][] tmp = new int[4][4];
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                tmp[i][j] = arr[i][j];
            }
        }

        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                if ((k & 1) == 1) {
                    tmp[i][j] ^= 1;
                    if (i > 0) {
                        tmp[i - 1][j] ^= 1;
                    }
                    if (i < 3) {
                        tmp[i + 1][j] ^= 1;
                    }
                    if (j > 0) {
                        tmp[i][j - 1] ^= 1;
                    }
                    if (j < 3) {
                        tmp[i][j + 1] ^= 1;
                    }
                }
                k >>= 1;
            }
        }
        return tmp;
    }
}


全部评论

相关推荐

03-26 13:04
已编辑
电子科技大学 算法工程师
xiaowl:你这个简历“条目上”都比较有深度性,但是实际上面试官又没法很好的评估你是怎么达到很多看上去很厉害的结果的。要避免一些看上去很厉害的包装,比如高效的内存复用策略的表达,如果仅是简单的一些内存共享机制,而且面试上也没有深挖的空间,就不要这样表达。比如,工程化模式本质上可能就是定义了一些abstract class,那也就没特别多值得讲的内容。建议简历上应该侧重那些你花了大量时间和精力解决、研究的问题,不要过分追求“丰富”,而是关注在技术深入度、问题解决能力的表现上。
没有实习经历,还有机会进...
点赞 评论 收藏
分享
在打卡的大老虎很想潜...:你在找实习,没啥实习经历,技术栈放前面,项目多就分两页写,太紧凑了,项目你最多写两个,讲清楚就行,项目背景。用到的技术栈、亮点、难点如何解决,人工智能进面太难了,需求少。你可以加最新大模型的东西
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务