联通块算周长
#include<iostream>
#include<cstring>
#include<cstdio>
#include<stdlib.h>
using namespace std;
int n, m, x1, y1, ans;
char a[200][200];
int map[200][200];
void change(int i, int j)
{
int k,l;
if (i < 1 || i > n || j < 1 || j > m) return;
map[i][j] = 1;
if(a[i - 1][j] == 'X' && (!map[i - 1][j])) change(i - 1, j);
if(a[i + 1][j] == 'X'&& (!map[i + 1][j])) change(i + 1, j);
if(a[i][j - 1] == 'X'&& (!map[i][j - 1])) change(i, j - 1);
if(a[i][j + 1] == 'X'&& (!map[i][j + 1])) change(i, j + 1);
if(a[i - 1][j - 1] == 'X'&& (!map[i - 1][j - 1])) change(i - 1, j - 1);
if(a[i + 1][j + 1] == 'X'&& (!map[i + 1][j + 1])) change(i + 1, j + 1);
if(a[i - 1][j + 1] == 'X'&& (!map[i - 1][j + 1])) change(i - 1, j + 1);
if(a[i + 1][j - 1] == 'X'&& (!map[i + 1][j - 1])) change(i + 1, j - 1);
}
void calc()
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
if (map[i][j])
{
if (!map[i - 1][j]) ans++;
if (!map[i + 1][j]) ans++;
if (!map[i][j - 1]) ans++;
if (!map[i][j + 1]) ans++;
}
}
}
}
int main()
{
while(scanf("%d%d%d%d", &n, &m, &x1, &y1) != EOF, n!=0 || m!=0 || x1!=0 || y1!=0)
{
for(int i = 1; i <= n; i++)
scanf("%s", a[i] + 1);
memset(map, 0, sizeof(map));
map[x1][y1] = 1;
ans = 0;
change(x1, y1);
calc();
printf("%d\n", ans);
}
return 0;
}
骑士游历计方案,注意因为字典序输出,所以需要注意mov数组的方向
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
#define maxn 26
struct Point
{
int x, y;
}way[maxn * maxn];
bool map[maxn][maxn];
int p, q;
bool fou;
int mov[8][2] ={{-2, -1},{-2, 1},{-1, -2},{-1, 2},{1, -2},{1, 2},{2, -1},{2, 1}};
bool can(int x, int y)
{
if (x < 0 || y < 0 || x >= q || y >= p)return false;
if (map[x][y]) return false;
return true;
}
void dfs(int x, int y, int dep)
{
way[dep].x = x;
way[dep].y = y;
if (dep == p * q - 1)
{
fou = true;
return;
}
for (int i = 0; i < 8; i++)
{
if (can(x + mov[i][0], y + mov[i][1]))
{
map[x + mov[i][0]][y + mov[i][1]] = true;
dfs(x + mov[i][0], y + mov[i][1], dep + 1);
if (fou) return;
map[x + mov[i][0]][y + mov[i][1]] = false;
}
}
}
void print()
{
for (int i = 0; i < p * q; i++)
printf("%c%d", way[i].x + 'A', way[i].y + 1);
printf("\n\n");
}
int main()
{
int t;
scanf("%d", &t);
int s = 0;
while (t--)
{
s++;
printf("Scenario #%d:\n", s);
memset(map, 0, sizeof(map));
scanf("%d%d", &p, &q);
for (int i = 0; i < q; i++)
{
for (int j = 0; j < p; j++)
{
fou = false;
map[i][j] = true;
dfs(i, j, 0);
if (fou) break;
map[i][j] = false;
}
if (fou) break;
}
if (fou)print();
else printf("impossible\n\n");
}
return 0;
}
数联通块数目
#include<iostream>
#include<cstring>
#include<cstdio>
#include<stdlib.h>
using namespace std;
int n, m;
char a[200][200];
void init()
{
memset(a, 0, sizeof(a));
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
{
cin >> a[i][j];
if (a[i][j] == '@')
a[i][j] = 1;
else a[i][j] = 0;
}
}
void change(int i, int j)
{
int k,l;
a[i][j] = 0;
if(a[i - 1][j] > 0) change(i - 1, j);
if(a[i + 1][j] > 0) change(i + 1, j);
if(a[i][j - 1] > 0) change(i, j - 1);
if(a[i][j + 1] > 0) change(i, j + 1);
if(a[i - 1][j - 1] > 0) change(i - 1, j - 1);
if(a[i + 1][j + 1] > 0) change(i + 1, j + 1);
if(a[i - 1][j + 1] > 0) change(i - 1, j + 1);
if(a[i + 1][j - 1] > 0) change(i + 1, j - 1);
}
int main()
{
cin >> n >> m;
while ((n != 0) && (m != 0))
{
init();
int cnt = 0;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
{
if (a[i][j] != 0)
{
change(i, j);
cnt++;
}
}
cout << cnt << endl;
cin >> n >> m;
}
return 0;
}
给若干个数,求其中选一些数的和为指定数的所有方案……相同的不要,通过一个剪枝可以剪掉!
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n, len, a[20], b[20], cnt;
inline bool cmp(int a, int b){ return a > b;}
void print(int x)
{
cnt++;
for(int i = 0; i < x; i++)
{
if(i) printf("+%d", b[i]);
else printf("%d", b[i]);
}
printf("\n");
}
void dfs(int x, int aa, int sum, int bb)
{
if(sum > n) return;
if(sum == n) print(bb);
for(int i = aa; i < len; i++)
{
b[bb] = a[i];
dfs(a[i], i + 1, sum + a[i], bb + 1);
while(i + 1 < len && a[i] == a[i + 1]) i++;
}
}
int main()
{
while(scanf("%d%d",&n, &len) != EOF && n + len != 0)
{
for(int i = 0; i < len; i++)
scanf("%d", &a[i]);
sort(a, a + len, cmp);
printf("Sums of %d:\n", n);
cnt = 0;
dfs(0, 0, 0, 0);
if(!cnt) printf("NONE\n");
}
return 0;
}