第一题: DominoesFinding
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define PII pair<int,int>
const int N=1e6+5;
int dx[2]={1,0};
int dy[2]={0,1};
int s[10][10];
int ans=0;
bool card[10][10];
bool a[10][10];
void dfs(int x,int y)
{
if(y>=7)
{
x++;
y=0;
}
if(x>=8)
{
ans++;
return;
}
if(a[x][y]) dfs(x,y+1);
else
{
for(int i=0;i<2;i++)
{
int xx=dx[i]+x;
int yy=dy[i]+y;
if(xx<0||xx>=8||yy<0||yy>=7) continue;
int x1=s[x][y],y1=s[xx][yy];
if(!a[xx][yy]&&!card[x1][y1])
{
a[xx][yy]=1;
card[x1][y1]=1;
card[y1][x1]=1;
dfs(x,y+1);
a[xx][yy]=0;
card[x1][y1]=0;
card[y1][x1]=0;
}
}
}
}
int main()
{
for(int i=0;i<8;i++)
{
for(int j=0;j<7;j++)
{
char ch;
cin>>ch;
s[i][j]=ch-'0';
}
}
dfs(0,0);
cout<<ans<<endl;
return 0;
}
第二题: cowrig
将1-25个方格坐标压缩成1-25个数字,接下来从25个数字任取7个数字,将这7个数字还原成坐标,判断是否符合题目条件:
1.'H'的个数<'J'的个数
2.这七个位置是否属于同一连通块
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define PII pair<int,int>
const int N=1e6+5;
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
string s[10];
int ans=0;
vector<int> q;
int num1,num2;
int xx,yy;
int st2[6][6];
bool st1[30];
bool bfs(int x,int y)
{
if(num1>num2||num1+num2!=7) return false;
int sum=1;
queue<PII> q;
q.push({x,y});
st2[x][y]=2;
while(q.size())
{
auto t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int xx=t.first+dx[i];
int yy=t.second+dy[i];
if(xx<1||xx>5||yy<1||yy>5) continue;
if(st2[xx][yy]==1)
{
sum++;
st2[xx][yy]=2;
q.push({xx,yy});
}
}
}
if(sum==7) return true;
else return false;
}
void dfs(int t)
{
if(q.size()==7)
{
memset(st2,0,sizeof(st2));
num1=0;
num2=0;
for(int i=0;i<q.size();i++)
{
if(q[i]%5==0) xx=q[i]/5;
else xx=q[i]/5+1;
if(q[i]%5==0) yy=5;
else yy=q[i]%5;
//cout<<xx<<" "<<yy<<endl;
if(s[xx][yy]=='H') num1++;
else if(s[xx][yy]=='J') num2++;
st2[xx][yy]=1;
}
if(bfs(xx,yy)) ans++;
return;
}
for(int i=t;i<=25;i++)
{
if(!st1[i])
{
st1[i]=true;
q.push_back(i);
dfs(i);
st1[i]=false;
q.pop_back();
}
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
for(int i=1;i<=5;i++)
{
for(int j=1;j<=5;j++)
{
cin>>s[i][j];
}
}
for(int i=1;i<=25;i++)
{
st1[i]=true;
q.push_back(i);
dfs(i);
st1[i]=false;
q.pop_back();
}
cout<<ans<<endl;
return 0;
}