日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【dfs】棋盘变幻

發(fā)布時(shí)間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【dfs】棋盘变幻 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

棋盤變幻

題目大意:

有一些棋子(黑/白),可以將某一列的棋子顏色反轉(zhuǎn),要黑棋盡可能小

原題:

題目描述

小G在一個(gè)n*m的棋盤上隨意放上了一些黑色的棋子,然后又在剩下所有沒(méi)有放棋子的格子里放上了白色的棋子。現(xiàn)在小G想知道他是否能通過(guò)以下兩種變換將整個(gè)棋盤上的棋子全部變成白色。
  變幻1:選擇一列,將這一列的棋子全部反色,即黑變白,白變黑。
  變幻2:選擇一行,將這一行的棋子全部反色。
  如果能將整個(gè)棋盤上的棋子全部變成白色,則輸出最少需要的變幻次數(shù)。否則輸出經(jīng)過(guò)若干次變幻后,棋盤上最少的黑子個(gè)數(shù)。

輸入

第一行兩個(gè)正整數(shù)n,m,含義見題面。
接下里n行,每行m個(gè)字符,‘0’表示白子,‘1’表示黑子。

輸出

一行一個(gè)整數(shù)ans,含義見題面。

輸入樣例

3 4 0111 0111 1000

輸出樣例

3

說(shuō)明

對(duì)于30%的數(shù)據(jù),1 ≤ n ,m ≤ 9。
對(duì)于60%的數(shù)據(jù),1 ≤ n ,m ≤ 15。
對(duì)于100%的數(shù)據(jù),1 ≤ n ≤ 16,1 ≤ m ≤ 20。

解題思路:

用dfs枚舉每一行翻不翻,然后枚舉每一列需不需要翻,然后取最優(yōu)的就可以了

代碼

#include<cstdio> #include<cstring> #include<iostream> using namespace std; int n,m,l,num,sum,ans,minn,a[25][25]; char x; void dfs(int dep,int c) {if (dep>n){l=c;num=0;for (int j=1;j<=m;++j){sum=0;for (int i=1;i<=n;++i)sum+=a[i][j];if (n-sum<sum) sum=n-sum,l++;//要翻num+=sum;//累加}minn=min(minn,num);if (!num) ans=min(ans,l);//記錄return;}for (int j=1;j<=m;++j)a[dep][j]=(a[dep][j]+1)%2;//所有都翻一遍dfs(dep+1,c+1);//翻for (int j=1;j<=m;++j)a[dep][j]=(a[dep][j]+1)%2;//返回來(lái)dfs(dep+1,c);//不翻 } int main() {scanf("%d %d",&n,&m);for (int i=1;i<=n;++i){getchar();for (int j=1;j<=m;++j){x=getchar();a[i][j]=x-48;//記錄}}ans=2147483647;minn=2147483647;dfs(1,0);if (!minn) printf("%d",ans);else printf("%d",minn); }

總結(jié)

以上是生活随笔為你收集整理的【dfs】棋盘变幻的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。