标签:

4 .X.. .... XX.. .... 2 XX .X 3 .X. X.X .X. 3 ... .XX .XX 4 .... .... .... .... 0
5 1 5 2 4
可以用深搜做,有点类似回溯,把每个点作为第一个搜索的起点来搜,搜完了再回溯,不过记得要把搜完的点复原,因为在下一个点来看上一个点是没动过的。
#include<stdio.h>
//城市的尺寸
int n;
//城市的地图,最多是4*4
char map[4][4];
//最多放的炮塔数
int bestn;
//看炮塔是否能够放置
int canput(int row, int col)
{
int i;
for (i = row - 1; i >= 0; i--)
{
if (map[i][col] == 'X')
{
break;
}
if (map[i][col] == 'o')
{
return 0;
}
}
for (i = col - 1; i >= 0; i--)
{
if (map[row][i] == 'X')
{
break;
}
if (map[row][i] == 'o')
{
return 0;
}
}
return 1;
}
//K表示放置炮塔的位置
void backtrack(int k, int current)
{
int x, y;
if (k >= n*n)
{
if (current>bestn)
{
bestn = current;
}
return;
}
else
{
x = k / n;
y = k%n;
if (map[x][y] == '.'&&canput(x, y))
{
map[x][y] = 'o';
backtrack(k + 1, current + 1);
map[x][y] = '.';
}
backtrack(k + 1, current);
}
}
void initial()
{
int i, j;
for (i = 0; i<4; i++)
{
for (j = 0; j<4; j++)
{
map[i][j] = '.';
}
}
}
int main()
{
scanf("%d", &n);
while (n)
{
int i, j;
bestn = 0;
initial();
for (i = 0; i<n; i++)
{
for (j = 0; j<n; j++)
{
char ch;
ch = getchar();
if (ch == '\n')
{
j--;
continue;
}
else
{
map[i][j] = ch;
}
}
}
backtrack(0, 0);
printf("%d\n", bestn);
scanf("%d", &n);
}
return 0;
}
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int MAXN = 105;
const int oo = 1e9;
bool G[MAXN][MAXN], used[MAXN];
int p[MAXN], x, y;
struct node{int x, y;}a[MAXN][MAXN];
bool Find(int u)
{///匈牙利算法匹配
for(int i=1; i<=y; i++)
{
if(G[u][i] && used[i] == false)
{
used[i] = true;
if(!p[i] || Find(p[i]))
{
p[i] = u;
return true;
}
}
}
return false;
}
int main()
{
int N;
while(scanf("%d", &N), N)
{
int i, j;
char s[MAXN][MAXN];
for(i=0; i<N; i++)
scanf("%s", s[i]);
x = y = 0;
for(i=0; i<N; i++)
for(j=0; j<N; j++)
{///把图分割,以相连的‘.’为行和列重新分配编号
if(s[i][j] == '.')
{
if(j == 0 || s[i][j-1] == 'X')
x++;
a[i][j].x = x;
}
if(s[j][i] == '.')
{
if(j == 0 || s[j-1][i] == 'X')
y++;
a[j][i].y = y;
}
}
memset(G, 0, sizeof(G));
for(i=0; i<N; i++)
for(j=0; j<N; j++)
{
if(s[i][j] == '.')
{
int u = a[i][j].x;
int v = a[i][j].y;
G[u][v] = true;///用行匹配列
}
}
int ans = 0;
memset(p, 0, sizeof(p));
for(i=1; i<=x; i++)
{
memset(used, false, sizeof(used));
if( Find(i) == true )
ans++;
}
printf("%d\n", ans);
}
return 0;
}标签:
原文地址:http://blog.csdn.net/wzngzaixiaomantou/article/details/51334059