zoukankan      html  css  js  c++  java
  • P1985 [USACO07OPEN]翻转棋

    题目链接:

    翻转棋

    题目分析:

    先状压/(dfs)枚举第一排状态,然后在每个(1)下面翻,即确定了第一排就确定了后面的状态
    最后验证一下最后一排是不是全0即可

    代码:

    #include<bits/stdc++.h> 
    #define N 50
    using namespace std;
    inline int read() {
    	int cnt = 0, f = 1; char c = getchar();
    	while (!isdigit(c)) {if (c == '-') f = -f; c = getchar();}
    	while (isdigit(c)) {cnt = (cnt << 3) + (cnt << 1) + (c ^ 48); c = getchar();}
    	return cnt * f;
    }
    int mapp[N][N], m, n, cnt, ans[N][N], res = (1 << 30);
    bool vis[N][N], flag;
    void rev(int x, int y) {
    	mapp[x][y] ^= 1;
    	mapp[x][y - 1] ^= 1;
    	mapp[x - 1][y] ^= 1;
    	mapp[x][y + 1] ^= 1;
    	mapp[x + 1][y] ^= 1; 
    }
    void cpy() {
    	for (register int i = 1; i <= m; ++i)
    		for (register int j = 1; j <= n; ++j) ans[i][j] = vis[i][j];
    }
    void work() {
    	for (register int i = 2; i <= m; ++i)
    		for (register int j = 1; j <= n; ++j) if (mapp[i - 1][j]) rev(i, j), vis[i][j] = 1, ++cnt;
    	flag = 0;
    	for (register int i = 1; i <= m; ++i)
    		for (register int j = 1; j <= n; ++j) if (mapp[i][j]) flag = 1;
    	if (!flag) if (cnt < res) cpy(), res = cnt;
    
    	for (register int i = 2; i <= m; ++i)
    		for (register int j = 1; j <= n; ++j) if (vis[i][j]) rev(i, j), vis[i][j] = 0, --cnt; 
    }
    void dfs_(int k) {
    	if (!k) {work(); return;}
    	dfs_(k - 1), rev(1, k), vis[1][k] = 1, ++cnt;
    	dfs_(k - 1), rev(1, k), vis[1][k] = 0, --cnt;
    }
    int main() {
    	m = read(), n = read();
    	for (register int i = 1; i <= m; ++i)
    		for (register int j = 1; j <= n; ++j) mapp[i][j] = read();
    	dfs_(n); 
    	if (res == (1 << 30)) return printf("IMPOSSIBLE"), 0; 
    	for (register int i = 1; i <= m; ++i) {
    		for (register int j = 1; j <= n; ++j) printf("%d ", ans[i][j]);
    		printf("
    ");
    	}
    	return 0;
    }#include<bits/stdc++.h> 
    #define N 50
    using namespace std;
    inline int read() {
    	int cnt = 0, f = 1; char c = getchar();
    	while (!isdigit(c)) {if (c == '-') f = -f; c = getchar();}
    	while (isdigit(c)) {cnt = (cnt << 3) + (cnt << 1) + (c ^ 48); c = getchar();}
    	return cnt * f;
    }
    int mapp[N][N], m, n, cnt, ans[N][N], res = (1 << 30);
    bool vis[N][N], flag;
    void rev(int x, int y) {
    	mapp[x][y] ^= 1;
    	mapp[x][y - 1] ^= 1;
    	mapp[x - 1][y] ^= 1;
    	mapp[x][y + 1] ^= 1;
    	mapp[x + 1][y] ^= 1; 
    }
    void cpy() {
    	for (register int i = 1; i <= m; ++i)
    		for (register int j = 1; j <= n; ++j) ans[i][j] = vis[i][j];
    }
    void work() {
    	for (register int i = 2; i <= m; ++i)
    		for (register int j = 1; j <= n; ++j) if (mapp[i - 1][j]) rev(i, j), vis[i][j] = 1, ++cnt;
    	flag = 0;
    	for (register int i = 1; i <= m; ++i)
    		for (register int j = 1; j <= n; ++j) if (mapp[i][j]) flag = 1;
    	if (!flag) if (cnt < res) cpy(), res = cnt;
    
    	for (register int i = 2; i <= m; ++i)
    		for (register int j = 1; j <= n; ++j) if (vis[i][j]) rev(i, j), vis[i][j] = 0, --cnt; 
    }
    void dfs_(int k) {
    	if (!k) {work(); return;}
    	dfs_(k - 1), rev(1, k), vis[1][k] = 1, ++cnt;
    	dfs_(k - 1), rev(1, k), vis[1][k] = 0, --cnt;
    }
    int main() {
    	m = read(), n = read();
    	for (register int i = 1; i <= m; ++i)
    		for (register int j = 1; j <= n; ++j) mapp[i][j] = read();
    	dfs_(n); 
    	if (res == (1 << 30)) return printf("IMPOSSIBLE"), 0; 
    	for (register int i = 1; i <= m; ++i) {
    		for (register int j = 1; j <= n; ++j) printf("%d ", ans[i][j]);
    		printf("
    ");
    	}
    	return 0;
    }
    
  • 相关阅读:
    SharePoint 2010 User Profile Sync Service自动停止
    如何区别多个svchost.exe?
    Log Parser分析IIS log的一个简单例子
    Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
    Windows中右键点击文件夹, 结果找不到共享选项卡, 怎么办?
    介绍SOS中的SaveModule命令
    SharePoint中Draft版本的文档不会收到document added的Alert Email
    和我一起学Windows Workflow Foundation(1)创建和调试一个WF实例
    门户网站
    C#基础—— check、lock、using语句归纳
  • 原文地址:https://www.cnblogs.com/kma093/p/11620134.html
Copyright © 2011-2022 走看看