A - Cakeminator
简单的模拟。。就这我还写了好久。。
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int r,c;
char s[15][15];
bool used[15][15];
char cc;
int sum;
int shu;
int main()
{
scanf("%d%d",&r,&c);
memset(used,0,sizeof(used));
sum = 0;
for(int i=0;i<r;i++)
{
cc = getchar();
for(int j=0;j<c;j++)
{
s[i][j] = getchar();
}
}
int q = 0;
for(int i=0;i<r;i++)
{
shu = 0;
q = 0;
for(int j=0;j<c;j++)
{
if(s[i][j] == '.'&&used[i][j] == 0)
{
shu++;
}
else if(s[i][j] != '.')
{
q = 1;
break;
}
}
if(q == 0)
{
sum += shu;
for(int j=0;j<c;j++)
{
used[i][j] = 1;
}
}
}
for(int i=0;i<c;i++)
{
shu = 0;
q = 0;
for(int j=0;j<r;j++)
{
if(s[j][i] == '.'&&used[j][i] == 0)
{
shu++;
}
else if(s[j][i] != '.')
{
q = 1;
break;
}
}
if(q == 0)
{
sum += shu;
for(int j=0;j<c;j++)
{
used[j][i] = 1;
}
}
}
printf("%d\n",sum);
return 0;
}
B - Road Construction
因为0<m<n/2,肯定会有未连接的空点,找空点就行了。
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int n,m;
int s[1005];
int main()
{
int x,y,q;
memset(s,0,sizeof(s));
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
s[x]++;
s[y]++;
}
for(int i=1;i<=n;i++)
{
if(s[i] == 0)
{
q = i;
break;
}
}
printf("%d\n",n-1);
for(int i=1;i<=n;i++)
{
if(i != q)
{
printf("%d %d\n",i,q);
}
}
return 0;
}
C - Purification
一开始以为必须要所有选择的点没有交集,结束就只是单纯的搜索行搜索列,还因为之前的误解写成了DFS,伤心啊。。
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int n,q;
char s[105][105];
bool used[105][105];
int dx[105];
int dy[105];
int shu;
char c;
void dfsh(int xx)
{
for(int i=1; i<=n; i++)
{
if(s[xx][i] == '.'&&shu != n)
{
if(shu != n)
{
dx[shu] = xx;
dy[shu] = i;
shu++;
dfsh(xx+1);
}
}
}
if(shu != n)
{
shu--;
}
}
void dfsl(int xx)
{
for(int i=1; i<=n; i++)
{
if(s[i][xx] == '.'&&shu != n)
{
if(shu != n)
{
dx[shu] = i;
dy[shu] = xx;
shu++;
dfsl(xx+1);
}
}
}
if(shu != n)
{
shu--;
}
}
int main()
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
c = getchar();
for(int j=1; j<=n; j++)
{
s[i][j] = getchar();
}
}
shu = 0;
dfsh(1);
if(shu < n)
{
shu = 0;
dfsl(1);
}
if(shu == n)
{
for(int i=0; i<n; i++)
{
printf("%d %d\n",dx[i],dy[i]);
}
}
else
{
printf("-1\n");
}
return 0;
}
D - Biridian Forest
从终点E开始往回搜索查距离的简单BFS,比赛的时候没想到这么弄,写成DFS直接TLE了。。
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int n,m;
char s[1005][1005];
bool used[1005][1005];
char c;
int xf[5] = {1,0,-1,0};
int yf[5] = {0,-1,0,1};
int sx,sy,swei,ex,ey,l,ll,q;
struct node
{
int dx,dy,dshu,dwei;
}d[1000005];
int shu;
bool cmp(node x,node y)
{
return x.dwei < y.dwei;
}
void bfs(int xx,int yy)
{
l++;
used[xx][yy] = 1;
for(int i=0;i<4;i++)
{
if(s[xx+xf[i]][yy+yf[i]] != 'T'&&used[xx+xf[i]][yy+yf[i]]==0)
{
if(s[xx+xf[i]][yy+yf[i]] == 'E')
{
if(l < ll)
{
ll = l;
}
}
else
{
dfs(xx+xf[i],yy+yf[i]);
}
}
}
l--;
used[xx][yy] = 0;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<=1001;i++)
{
for(int j=0;j<=1001;j++)
{
used[i][j] = 1;
}
}
for(int i=1;i<=n;i++)
{
c = getchar();
for(int j=1;j<=m;j++)
{
s[i][j] = getchar();
}
}
/*for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cout<<s[i][j];
}
cout<<endl;
}*/
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
l = 0;
ll = 1000000;
if(s[i][j] == 'S')
{
for(int ii=1;ii<=n;ii++)
{
for(int jj = 1;jj<=m;jj++)
{
used[ii][jj] = 0;
}
}
dfs(i,j);
sx = i;
sy = j;
swei = ll;
//cout<<ll<<endl<<"aaaaaaaa"<<endl;
}
else if(s[i][j] > '0' && s[i][j] <= '9')
{
//cout<<s[i][j]<<endl;
//cout<<i<<' '<<j<<endl;
for(int ii=1;ii<=n;ii++)
{
for(int jj = 1;jj<=m;jj++)
{
used[ii][jj] = 0;
}
}
dfs(i,j);
d[shu].dx = i;
d[shu].dy = j;
d[shu].dwei = ll;
//cout<<ll<<endl;
//cout<<i<<' '<<j<<endl;
int aa = s[i][j] - '0';
d[shu].dshu = aa;
//cout<<d[shu].dwei<<endl;
shu++;
}
}
}
sort(d,d+shu,cmp);
int i = 0;
int sum = 0;
while(i < shu&&d[i].dwei <= swei)
{
sum += d[i].dshu;
i++;
}
printf("%d\n",sum);
return 0;
}