标签:
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