UVA11464偶数矩阵
生活随笔
收集整理的這篇文章主要介紹了
UVA11464偶数矩阵
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ? 給你一個n*n的01矩陣,你的你的任務是吧盡量少的0變成1,使得每個元素的上下左右之和均為偶數(如果有的話),比如
0 0 0 ? ? ? ? 0 1 0
1 0 0 ?---> ? 1 0 1 ??
0 0 0 ? ? ? ? 0 1 0
是變換了3個。
思路:
? ? ? 這個題目拿到手的最暴力的反應就是直接搜索枚舉所有,那么時間復雜度是
O(2^(15*15))直接就跪了,其實這個題目有個很關鍵的突破口,就是只要第一行確定了,那么其他的都是確定的,這個可以自己找幾個矩陣試驗下,所以我們可以直接深搜去枚舉第一行,然后根據第一行吧所有的都填充完,看看有沒有沖突,如果沒有就更新答案的最優值,這樣的時間復雜度是O(2^15*15*15) = O(32768 * 225)沒啥大壓力。
? ? ?
#include<stdio.h>
int map[16][16] ,now[16][16];
int Ans ,n;
void DFS(int noww)
{
? ?if(noww == n + 1)
? ?{
? ? ? int tmp = 0;?
? ? ? for(int i = 1 ;i <= n ;i ++)
? ? ? if(!map[1][i] && now[1][i]) tmp ++; ??
? ? ? for(int i = 2 ;i <= n ;i ++)
? ? ? for(int j = 1 ;j <= n ;j ++)
? ? ? {
? ? ? ? ? int ss = 0 ,nowi = i - 1 ,nowj = j;
? ? ? ? ? if(nowi >= 2) ss += now[nowi-1][j];
? ? ? ? ? if(nowj >= 2) ss += now[nowi][j-1];
? ? ? ? ? if(nowj <= n-1) ss += now[nowi][j+1];
? ? ? ? ? now[i][j] = ss % 2;
? ? ? ? ? if(!map[i][j] && now[i][j]) tmp ++;
? ? ? ? ? if(map[i][j] && !now[i][j]) return;
? ? ? }
? ? ? if(Ans == -1 || Ans > tmp) Ans = tmp;
? ? ? return;
? ?}
? ?
? ?now[1][noww] = 1;
? ?DFS(noww+1);
? ?if(!map[1][noww])
? ?{
? ? ? ?now[1][noww] = 0;
? ? ? ?DFS(noww+1);
? ?}
}
int main ()
{
? ? int i ,j ,t ,cas = 1;
? ? scanf("%d" ,&t);
? ? while(t--)
? ? {
? ? ? ?scanf("%d" ,&n);
? ? ? ?for(i = 1 ;i <= n ;i ++)
? ? ? ?for(j = 1 ;j <= n ;j ++)
? ? ? ?scanf("%d" ,&map[i][j]);
? ? ? ?Ans = -1;
? ? ? ?DFS(1);
? ? ? ?printf("Case %d: %d\n" ,cas ++ ,Ans);
? ? }
? ? return 0;
}
? ? ??
? ? ? 給你一個n*n的01矩陣,你的你的任務是吧盡量少的0變成1,使得每個元素的上下左右之和均為偶數(如果有的話),比如
0 0 0 ? ? ? ? 0 1 0
1 0 0 ?---> ? 1 0 1 ??
0 0 0 ? ? ? ? 0 1 0
是變換了3個。
思路:
? ? ? 這個題目拿到手的最暴力的反應就是直接搜索枚舉所有,那么時間復雜度是
O(2^(15*15))直接就跪了,其實這個題目有個很關鍵的突破口,就是只要第一行確定了,那么其他的都是確定的,這個可以自己找幾個矩陣試驗下,所以我們可以直接深搜去枚舉第一行,然后根據第一行吧所有的都填充完,看看有沒有沖突,如果沒有就更新答案的最優值,這樣的時間復雜度是O(2^15*15*15) = O(32768 * 225)沒啥大壓力。
? ? ?
#include<stdio.h>
int map[16][16] ,now[16][16];
int Ans ,n;
void DFS(int noww)
{
? ?if(noww == n + 1)
? ?{
? ? ? int tmp = 0;?
? ? ? for(int i = 1 ;i <= n ;i ++)
? ? ? if(!map[1][i] && now[1][i]) tmp ++; ??
? ? ? for(int i = 2 ;i <= n ;i ++)
? ? ? for(int j = 1 ;j <= n ;j ++)
? ? ? {
? ? ? ? ? int ss = 0 ,nowi = i - 1 ,nowj = j;
? ? ? ? ? if(nowi >= 2) ss += now[nowi-1][j];
? ? ? ? ? if(nowj >= 2) ss += now[nowi][j-1];
? ? ? ? ? if(nowj <= n-1) ss += now[nowi][j+1];
? ? ? ? ? now[i][j] = ss % 2;
? ? ? ? ? if(!map[i][j] && now[i][j]) tmp ++;
? ? ? ? ? if(map[i][j] && !now[i][j]) return;
? ? ? }
? ? ? if(Ans == -1 || Ans > tmp) Ans = tmp;
? ? ? return;
? ?}
? ?
? ?now[1][noww] = 1;
? ?DFS(noww+1);
? ?if(!map[1][noww])
? ?{
? ? ? ?now[1][noww] = 0;
? ? ? ?DFS(noww+1);
? ?}
}
int main ()
{
? ? int i ,j ,t ,cas = 1;
? ? scanf("%d" ,&t);
? ? while(t--)
? ? {
? ? ? ?scanf("%d" ,&n);
? ? ? ?for(i = 1 ;i <= n ;i ++)
? ? ? ?for(j = 1 ;j <= n ;j ++)
? ? ? ?scanf("%d" ,&map[i][j]);
? ? ? ?Ans = -1;
? ? ? ?DFS(1);
? ? ? ?printf("Case %d: %d\n" ,cas ++ ,Ans);
? ? }
? ? return 0;
}
? ? ??
總結
以上是生活随笔為你收集整理的UVA11464偶数矩阵的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UVA11462年龄排序
- 下一篇: UVA11520填充正方形