搜索引擎对网站推广的作用,59网一起做网站,软文是什么意思?,企业买好域名后怎么做网站棋盘变幻
题目大意#xff1a;
有一些棋子#xff08;黑/白#xff09;#xff0c;可以将某一列的棋子颜色反转#xff0c;要黑棋尽可能小
原题#xff1a;
题目描述
小G在一个n*m的棋盘上随意放上了一些黑色的棋子#xff0c;然后又在剩下所有没有放棋子的格子里放…棋盘变幻
题目大意
有一些棋子黑/白可以将某一列的棋子颜色反转要黑棋尽可能小
原题
题目描述
小G在一个n*m的棋盘上随意放上了一些黑色的棋子然后又在剩下所有没有放棋子的格子里放上了白色的棋子。现在小G想知道他是否能通过以下两种变换将整个棋盘上的棋子全部变成白色。 变幻1选择一列将这一列的棋子全部反色即黑变白白变黑。 变幻2选择一行将这一行的棋子全部反色。 如果能将整个棋盘上的棋子全部变成白色则输出最少需要的变幻次数。否则输出经过若干次变幻后棋盘上最少的黑子个数。
输入
第一行两个正整数nm含义见题面。 接下里n行每行m个字符‘0’表示白子‘1’表示黑子。
输出
一行一个整数ans含义见题面。
输入样例
3 4
0111
0111
1000输出样例
3说明
对于30%的数据1 ≤ n m ≤ 9。 对于60%的数据1 ≤ n m ≤ 15。 对于100%的数据1 ≤ n ≤ 161 ≤ m ≤ 20。
解题思路
用dfs枚举每一行翻不翻然后枚举每一列需不需要翻然后取最优的就可以了
代码
#includecstdio
#includecstring
#includeiostream
using namespace std;
int n,m,l,num,sum,ans,minn,a[25][25];
char x;
void dfs(int dep,int c)
{if (depn){lc;num0;for (int j1;jm;j){sum0;for (int i1;in;i)suma[i][j];if (n-sumsum) sumn-sum,l;//要翻numsum;//累加}minnmin(minn,num);if (!num) ansmin(ans,l);//记录return;}for (int j1;jm;j)a[dep][j](a[dep][j]1)%2;//所有都翻一遍dfs(dep1,c1);//翻for (int j1;jm;j)a[dep][j](a[dep][j]1)%2;//返回来dfs(dep1,c);//不翻
}
int main()
{scanf(%d %d,n,m);for (int i1;in;i){getchar();for (int j1;jm;j){xgetchar();a[i][j]x-48;//记录}}ans2147483647;minn2147483647;dfs(1,0);if (!minn) printf(%d,ans);else printf(%d,minn);
}