1316 回文矩陣
基準時間限制:1 秒 空間限制:131072 kb 分值:
40 難度:4級演算法題 收藏 關注
乙個n*m的矩陣a完全由0與1兩個數字組成(0
8),矩陣第i行第j列上的項為a[i][j],i與j從0標起,即0
<=i0
<=j1)將矩陣中的任一項a[i][j]改為數字1;
(2)將矩陣中的任一項a[i][j]改為數字0;
現在給出初始的矩陣a,要求經過最少次操作,使矩陣a中至少有rowcount行是回文的,同時存在至少columcount列是回文的。輸出這個最少操作的次數。
矩陣中第r行是回文的,指序列回文,即所有的 i 有a[r][i]=a[r][m-1-i];
矩陣中第c列是回文的,指序列回文,即所有的 i 有a[i][c]=a[n-1-i][c].
例如4x4的矩陣如下:
0000
1000
1100
1110
要求rowcount = 2,且columcount = 2.
可以將a[3][0]改為0,使第0行與第3行回文,同時第0列與第3列回文。變化後如下:
0000
1000
1100
0110
input
第一行兩個正整數,表示rowcount,columcount,且0
<=rowcount<=n,0
<=columcount<=m.
第二行乙個整數n,即矩陣的行數,1
<=n<=8.
之後有n行,每行乙個由m個『0』、『1』字元構成的字串,表示n*m矩陣的資訊。
output
乙個整數,表示最少操作的次數。
input示例22
40000
1000
1100
1110
output示例
1孔炤 (題目提供者)
列舉出是回文的r行和c列
確定a[i][j],如果i行是回文 a[i][m-j-1]=a[i][j]
j列是回文 a[n-i-1][j]=a[i][j]
n-i-1行是回文 a[n-i-1][m-j-1]=a[i][j]…
遍歷i,j 選出a[i][j]能確定的位置,並確定最小需要多少次改變操作即可o(
crn∗
ccm∗
n∗m)
#include
#include
#define ll long long
#define pii pair
#define mem(a,x) memset(a,x,sizeof(a))
using
namespace
std;
const
int inf=1e9+7;
char str[8][9];
bool vis[8][8];
int n,m;
vector
vec;
inline
int bits(int x)
return ans;
}int f(int i,int j,int x,int y));
int ii=n-i-1,jj=m-j-1;
bool flag=false;
if((1}}
if((1
ans=min(ans,sum);
}for(int z=0;zint i=vec[z].first,j=vec[z].second;
vis[i][j]=true;
}return ans;
}int check(int x,int y)
ans+=f(i,j,x,y);}}
return ans;
}int slove(int r,int c)}}
}return ans;
}int main()
m=strlen(str[0]);
printf("%d\n",slove(r,c));
}return
0;}
51nod 1316 回文矩陣 (列舉 判斷)
思路 因為n 和m 並不會很大,所以就直接列舉 r c 的所有情況,然後將這些情況的結果算出來就可以。列舉每個點對應的四個點是否被選中就可以。這裡有幾種情況 includeusing namespace std const int inf 0x3f3f3f const int n 10 int a ...
51Nod 1316 回文矩陣
acm模版 這道題搞得我挺焦慮的,矩陣不大,可以暴力列舉。列舉所有的組合,然後在這些組合內部,先固定選取的行,然後遍歷列,保證遍歷完後,選取的行都是回文的 然後再固定選取的列,接著遍歷行,保證遍歷完後,選取的列都是回文的 每種組合得到乙個需要改動的次數,從所有結果中選取最優的即可。include i...
51nod 1316 回文矩陣
思路 預處理出所有的行和列分別為row,col的情況,再遍歷所有情況,之中遍歷矩陣a i j 對於行i,列j是否選取分情況討論 一,行i,列j都選取。對於上圖,行0和列0被選中,此時改變s 0 0 受影響的有s 0 3 s 3 0 因此需要對這三個值進行判斷取最小改變值,此外還有另一種情況,當行3或...