题意 : 给你一块n×m的矩阵,每一个格子可以施肥或者是种苹果,种一颗苹果可以得到一个苹果,但是如果你在一个格子上施了肥,那么所有与该格子相邻(指上下左右)的有苹果树的地方最后得到的苹果是两倍,如果(i,j)有一颗苹果树,(i-1,j)与(i,j+1)施了肥,那么苹果应该是1的两倍2,2的两倍4,最后是4个苹果,问你怎么安排苹果和施肥的格子使最后得到的苹果最多。
思路 : 画了图就可以看出来,苹果和苹果,肥与肥之间不要相邻就好了,所有的苹果之间都有施肥,所有施肥的格子都被苹果隔开了才能得到最多的苹果。
#include <cstdio>
#include <cstring>
#include <iostream>
#define LL long long using namespace std ; int mp[][] ; int main()
{
int T ,n,m;
cin >> T ;
while(T--)
{
cin >> n >> m ;
if(n == && m == )
{
printf("1\n") ;
continue ;
}
memset(mp,,sizeof(mp)) ;
for(int i = ; i <= n ; i++)
{
if(i % )
{
for(int j = ; j <= m ; j += )
mp[i][j] = ;
}
else
{
for(int j = ; j <= m ; j += )
mp[i][j] = ;
}
}
LL ans = ,cnt;
for(int i = ; i <= n ; i++)
{
for(int j = ; j <= m ; j++)
{
cnt = ;
if(mp[i][j]) continue ;
if(i- >= && mp[i-][j]) cnt ++ ;
if(i+ <= n && mp[i+][j]) cnt ++ ;
if(j- >= && mp[i][j-]) cnt ++ ;
if(j+ <= m && mp[i][j+]) cnt ++ ;
ans += 1LL << cnt ;
}
}
printf("%I64d\n",ans) ;
}
return ;
}