题意:给定表的大小和宾馆的个数,对于给的宾馆数问能不能将宾馆都放在图上并且从左下角到右上角与从左上角到右下角最短路的数目相同。
思路:对于偶数个,只要上下对称就可以满足条件,但是对于奇数个该如何判断,不要去想当然,觉着可以就可以了,或者编码通过bfs和dfs算一下不同情况下的最短路,一定要确保编码的思路是正确的才能保证ac额
bfs求一下两个方法的路径个数
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX=0x7fffffff;
char s[5][100];
struct point
{
int x;int y;
};
bool judge(int x,int y){
if(s[x][y]=='#') return false;
if(x>4) return false;
if(y>4) return false;
return true;
}
bool judge1(int x,int y){
if(s[x][y]=='#') return false;
if(x<1) return false;
if(y>4) return false;
return true;
}
int bfs1()
{
queue<point> que;
point p;
p.x=1; p.y=1;
que.push(p);
int ans=0;
while(!que.empty()){
point pp=que.front();
que.pop();
if(pp.x==4&&pp.y==4){
ans++;
continue;
}
if(judge(pp.x+1,pp.y)){
p.x=pp.x+1;
p.y=pp.y;
que.push(p);
}
if(judge(pp.x,pp.y+1)){
p.x=pp.x;
p.y=pp.y+1;
que.push(p);
}
}
return ans;
}
int bfs2()
{
queue<point> que;
point p;
p.x=4; p.y=1;
que.push(p);
int ans=0;
while(!que.empty()){
point pp=que.front();
que.pop();
if(pp.x==1&&pp.y==4){
ans++;
continue;
}
if(judge1(pp.x-1,pp.y)){
p.x=pp.x-1;
p.y=pp.y;
que.push(p);
}
if(judge1(pp.x,pp.y+1)){
p.x=pp.x;
p.y=pp.y+1;
que.push(p);
}
}
return ans;
}
int main()
{
for(int i=0;i<=4;i++){
for(int j=0;j<=11;j++){
s[i][j]='.';
}
}
s[2][2]='#';
int q1=bfs1();
cout<<q1<<endl;
int q2=bfs2();
cout<<q2<<endl;
}
ac代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX=0x7fffffff;
int main()
{
int n,k;
cin>>n>>k;
char s[5][150];
for(int i=0;i<4;i++){
for(int j=0;j<n;j++){
s[i][j]='.';
}
}
int flag=0;
if(k%2==0){
flag=1;
for(int i=1;i<=k/2;i++){
s[1][i]='#';
s[2][i]='#';
}
}
else if(k>=n){
flag=1;
for(int i=1;i<n-1;i++)
s[1][i]='#';
s[2][1]='#';
s[2][n-2]='#';
int jj=k-n;
for(int j=1;j<=jj;j++){
s[2][j+1]='#';
}
}
else if(k<=n-2){
flag=1;
s[1][n/2]='#';
for(int i=1;i<=(k-1)/2;i++){
s[1][n/2-i]='#';
s[1][n/2+i]='#';
}
}
if(flag){
cout<<"YES"<<endl;
for(int i=0;i<4;i++){
for(int j=0;j<n;j++){
cout<<s[i][j];
}
cout<<endl;
}
}
else{
cout<<"NO"<<endl;
}
}