今日总结
一、C
1.链接:https://vjudge.net/contest/446142#problem/C
2.题解:via数组用来标记棋盘上的某点是否遍历过,ans表示摆出的方案数目,k表示所放棋子的数量。当输入值不为-1,-1时,输入数据并将vis数组初始化为0(即表示未被遍历),令方案数为0,进行深度遍历搜索,当剩余棋子数等于0时摆放完毕,方案数加一,运用嵌套循环,当地图上某点为空白区域或者已遍历时,表示找到合适的位置并进行标记,再继续搜索下一行并且所放棋子数减1,再标记该点,最终输出ans。
3.代码:
#include<stdio.h>
#include<string.h>
char map[10][10];
int vis[50],n,k,ans;
void dfs(int m,int k)
{
int i,j;
if(k==0) ans++;
for(i=m;i<n;i++)
{
for(j=0;j<n;j++)
{
if(map[i][j]=='.'||vis[j]==1) continue;
vis[j]=1;
dfs(i+1,k-1);
vis[j]=0;
}
}
}
int main()
{
int i;
while(~scanf("%d%d",&n,&k))
{
if(n==-1&&k==-1) break;
for(i=0;i<n;i++)
{
scanf("%s",&map[i]);
}
memset(vis,0,sizeof(vis));
ans=0;
dfs(0,k);
printf("%d\n",ans);
}
return 0;
}
二、D
1.链接:https://vjudge.net/contest/446142#problem/D
2.题解:n表示地球坐标,k表示牛牛星坐标,数组a表示队列,数组z表示到达不同坐标的所用的步数。先将z数组进行初始化,输入数据并将队首队尾下标均定义为0,将地球坐标入队列,再令到达该点所用步数定义为0,当队尾小于队首时,把队尾赋给b,如果b等于牛牛星坐标时,结束程序,第一种情况,当b-1大于等于0且到达该点的步数仍为初始值时,该点的步数则为后一点步数再加1,再将该点入队列,第二种情况,当b+1小于等于100005且到达该点的步数仍为初始值时,该点的步数则为前一点步数再加1,再将该点入队列,第三种情况,当b*2小于等于100005且到达该点的步数仍为初始值时,该点的步数则为在b点的步数再加1,再将该点入队列,最后输出z[k]。
3.代码:
#include <stdio.h>
#include <string.h>
int z[100005];
int a[100005];
int main()
{
int n,k,front,rear;
memset(z,-1,sizeof(z));
scanf("%d%d",&n,&k);
front=rear=0;
a[front++]=n;
z[n]=0;
while(rear<front)
{
int b=a[rear++];
if(b==k)
break;
if(b-1>=0&&z[b-1]==-1)
{
z[b-1]=z[b]+1;
a[front++]=b-1;
}
if(b+1<100005&&z[b+1]==-1)
{
z[b+1]=z[b]+1;
a[front++]=b+1;
}
if(b*2<100005&&z[b*2]==-1)
{
z[b*2]=z[b]+1;
a[front++]=b*2;
}
}
printf("%d\n",z[k]);
return 0;
}
|