您的位置:首页 > 其它

蓝桥杯 剪邮票

2016-03-20 20:58 232 查看
思路:dfs每个格子选或不选,选定5个格子后判连通。这样写好像不会漏情况。结果是116

#include <iostream>
#include <cstdio>
using namespace std;
int map[3][4];
int temp_map[3][4];
bool in[3][4];
int dx[4] = {0,1,0,-1};
int dy[4] = {1,0,-1,0};
void dfs_connected(int x,int y)
{
temp_map[x][y] = false;
for(int k = 0;k < 4;k ++)
{
int nx = x + dx[k];
int ny = y + dy[k];
if(nx >= 0 && nx < 3 && ny >= 0 && ny < 4 && temp_map[nx][ny])
{
dfs_connected(nx,ny);
}
}
}
int dfs(int x,int y,int cur)
{
if(x == 3)
return 0;
if(cur == 5)
{
for(int i = 0;i < 3;i ++)
{
for(int j = 0;j < 4;j ++)
{
temp_map[i][j] = in[i][j];
}
}
int cnt = 0;
for(int i = 0;i < 3;i ++)
{
for(int j = 0;j < 4;j ++)
{
if(temp_map[i][j])
{
dfs_connected(i,j);
cnt ++;
}
}
}
if(cnt > 1)
return 0;
return 1;
}
int nx;
int ny;
int cnt = 0;
if(y < 3)
{
ny = y + 1;
nx = x;
}
else
{
ny = 0;
nx = x + 1;
}
if(x == -1 && y == 0)
{
nx = ny = 0;
}
in[nx][ny] = true;
cnt += dfs(nx,ny,cur + 1);
in[nx][ny] = false;
cnt += dfs(nx,ny,cur);
return cnt;
}
int main()
{
cout << dfs(-1,0,0) << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: