题解 P1817 【棋盘染色_NOI导刊2011提高(03)】
VenusM1nT
·
·
题解
古代评测姬怎么比现在快那么多啊QAQ
啊算了不管了
这道题……和P4537 [CQOI2007]矩形基本一模一样,但是这道题每种不同的分割方式,如果把黑白颜色交换是不同的方式,所以做法就是两趟爆搜分界线,从左侧和下侧开始爆搜,然后答案乘上2
此时你会光荣的收到TLE\times 3,但是这道题因为是一道计数的爆搜题,所以基本上应该是没有办法剪枝的,于是我们此时除了开O2(不知道能不能AC)还有什么办法呢?
回头看看数据范围,n\leq 7,m\leq 8,想到了什么?
没错,打表啊!
于是我们打表即可AC~
(注意,(7,8)这组极限数据要开long\ long)
打表程序:
#include<bits/stdc++.h>
using namespace std;
int n,m;
long long ans;
int dx[]={0,1,-1,0,0},dy[]={0,0,0,1,-1};
bool vis[15][15];
void Dfs(int x,int y)
{
if(x<1 || x>=n || y<1 || y>=m) ans++;
else
{
vis[x][y]=1;
for(int i=1;i<=4;i++)
{
int nx=x+dx[i],ny=y+dy[i];
if(!vis[nx][ny]) Dfs(nx,ny);
}
vis[x][y]=0;
}
}
int main()
{
freopen("1.txt","r",stdin);
freopen("ans2.txt","w",stdout);
while(cin>>n>>m)
{
ans=0;
for(int i=1;i<n;i++)
{
memset(vis,0,sizeof(vis));
vis[i][0]=1;
Dfs(i,1);
}
for(int i=1;i<m;i++)
{
memset(vis,0,sizeof(vis));
vis[0][i]=1;
Dfs(1,i);
}
printf(" else if(n==%d && m==%d) cout<<\"%lld\"<<endl;\n",n,m,ans*2);
}
return 0;
}
```cpp
#include<bits/stdc++.h>
using namespace std;
int n,m;
int main()
{
scanf("%d %d",&n,&m);
if(!n || !m) cout<<"0"<<endl;
else if(n==1 && m==1) cout<<"0"<<endl;
else if(n==1 && m==2) cout<<"2"<<endl;
else if(n==1 && m==3) cout<<"4"<<endl;
else if(n==1 && m==4) cout<<"6"<<endl;
else if(n==1 && m==5) cout<<"8"<<endl;
else if(n==1 && m==6) cout<<"10"<<endl;
else if(n==1 && m==7) cout<<"12"<<endl;
else if(n==1 && m==8) cout<<"14"<<endl;
else if(n==2 && m==1) cout<<"2"<<endl;
else if(n==2 && m==2) cout<<"12"<<endl;
else if(n==2 && m==3) cout<<"30"<<endl;
else if(n==2 && m==4) cout<<"56"<<endl;
else if(n==2 && m==5) cout<<"90"<<endl;
else if(n==2 && m==6) cout<<"132"<<endl;
else if(n==2 && m==7) cout<<"182"<<endl;
else if(n==2 && m==8) cout<<"240"<<endl;
else if(n==3 && m==1) cout<<"4"<<endl;
else if(n==3 && m==2) cout<<"30"<<endl;
else if(n==3 && m==3) cout<<"104"<<endl;
else if(n==3 && m==4) cout<<"286"<<endl;
else if(n==3 && m==5) cout<<"700"<<endl;
else if(n==3 && m==6) cout<<"1598"<<endl;
else if(n==3 && m==7) cout<<"3488"<<endl;
else if(n==3 && m==8) cout<<"7390"<<endl;
else if(n==4 && m==1) cout<<"6"<<endl;
else if(n==4 && m==2) cout<<"56"<<endl;
else if(n==4 && m==3) cout<<"286"<<endl;
else if(n==4 && m==4) cout<<"1228"<<endl;
else if(n==4 && m==5) cout<<"4862"<<endl;
else if(n==4 && m==6) cout<<"18368"<<endl;
else if(n==4 && m==7) cout<<"67206"<<endl;
else if(n==4 && m==8) cout<<"240180"<<endl;
else if(n==5 && m==1) cout<<"8"<<endl;
else if(n==5 && m==2) cout<<"90"<<endl;
else if(n==5 && m==3) cout<<"700"<<endl;
else if(n==5 && m==4) cout<<"4862"<<endl;
else if(n==5 && m==5) cout<<"32000"<<endl;
else if(n==5 && m==6) cout<<"204294"<<endl;
else if(n==5 && m==7) cout<<"1274660"<<endl;
else if(n==5 && m==8) cout<<"7807790"<<endl;
else if(n==6 && m==1) cout<<"10"<<endl;
else if(n==6 && m==2) cout<<"132"<<endl;
else if(n==6 && m==3) cout<<"1598"<<endl;
else if(n==6 && m==4) cout<<"18368"<<endl;
else if(n==6 && m==5) cout<<"204294"<<endl;
else if(n==6 && m==6) cout<<"2228788"<<endl;
else if(n==6 && m==7) cout<<"23896710"<<endl;
else if(n==6 && m==8) cout<<"252488208"<<endl;
else if(n==7 && m==1) cout<<"12"<<endl;
else if(n==7 && m==2) cout<<"182"<<endl;
else if(n==7 && m==3) cout<<"3488"<<endl;
else if(n==7 && m==4) cout<<"67206"<<endl;
else if(n==7 && m==5) cout<<"1274660"<<endl;
else if(n==7 && m==6) cout<<"23896710"<<endl;
else if(n==7 && m==7) cout<<"441524056"<<endl;
else if(n==7 && m==8) cout<<"8056291934"<<endl;
return 0;
}
```