A. 最大黑色区域
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<queue>
#include<stack>
#include<math.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
typedef long long ll;
int n,m,sum,k;
int a[105][105];
int visited[105][105];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
struct node{
int i,j;
};
void bfs(int i,int j){
queue<node> q;
node t,next;
t.i=i;
t.j=j;
q.push(t);
visited[i][j]=1;
sum++;
while(!q.empty()){
t=q.front();
q.pop();
for(int i=0;i<4;i++){
int xx=t.i+dx[i];
int yy=t.j+dy[i];
if(xx<0||xx>=n||yy<0||yy>=m||visited[xx][yy]||a[xx][yy]==0)
continue;
visited[xx][yy]=1;
next.i=xx;
next.j=yy;
q.push(next);
sum++;
}
}
if(sum>k)
k=sum;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++){
char c;cin>>c;
a[i][j]=(int)c-48;
//cout<<a[i][j];
}
memset(visited,0,sizeof(visited));
k=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(!visited[i][j]&&a[i][j]==1){
sum=0;
bfs(i,j);
}
printf("%d\n",k);
}
B. 门票问题
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int l,c;
char str[27];
int book[27];
int a[27],pd;
int step=0;
void dfs(int ans,int ans_yuan,int ans_fu) {//深搜
int i,j;
if(step>=25000)return;//输出前25000个答案
if(ans==l+1) {
if(ans_yuan>=1&&ans_fu>=2) {//判断原音辅音
++step;
if(pd==1)cout<<endl;//处理换行
else pd=1;
for(int j=1; j<=l; j++) {
cout<<str[a[j]];//输出
}
}
return;
}
for(i=a[ans-1]+1; i<=c; i++) {
if(book[i]==0) {
book[i]=1;//标记置1
a[ans]=i;
if(str[i]=='a'||str[i]=='e'||str[i]=='i'||str[i]=='o'||str[i]=='u')dfs(ans+1,ans_yuan+1,ans_fu);//元音个数+1
else dfs(ans+1,ans_yuan,ans_fu+1);//辅音个数+1
book[i]=0;//回溯
}
}
}
int main() {
int i;
cin>>l>>c;
for(i=1; i<=c; i++)cin>>str[i];//输入
sort(str+1,str+c+1);//按字典序排序
dfs(1,0,0);
}
C. 图的遍历
#include<iostream>
#include <algorithm>
#include<vector>
using namespace std;
int n;
int a[21][21];
int dfs(vector<int>ans,int x,int n,int a[][21]){
for(int i=0;i<n;i++){
if(a[x][i]==1){
//cout<<"查到"<<x<<","<<i<<endl;
vector<int>::iterator result=find(ans.begin( ),ans.end( ),i);
if (result==ans.end( )){
ans.push_back(i);
//cout<<"正常遍历到"<<i<<endl;
cout<<"-"<<i+1;
return dfs(ans,i,n,a);
break;
}
}
else{
if(i==n-1){
for(int i=0;i<n;i++){
vector<int>::iterator result=find(ans.begin( ),ans.end( ),i);
if (result==ans.end( )){
ans.push_back(i);
cout<<"-"<<i+1;
//cout<<"异常遍历到"<<i<<endl;
return dfs(ans,i,n,a);
}
}
}
}
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>a[i][j];
}
}
vector<int>ans;
ans.push_back(0);
cout<<"1";
dfs(ans,0,n,a);
}
D. 速算游戏
#include<iostream>
#include<algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
using namespace std;
vector<string>ans;
int calc(int a,int b,char x){
switch(x){
case'+':{
//cout<<a<<"+"<<b<<endl;
return (int)(a+b);
break;
}
case'-':{
//cout<<a<<"-"<<b<<endl;
return (int)(a-b);
break;
}
case'*':{
//cout<<a<<"*"<<b<<endl;
return (int)(a*b);
break;
}
case'/':{
if(b!=0){
//cout<<a<<"/"<<b<<endl;
return (int)(a/b);
}
else{
return 0;
}
break;
}
case'^':{
//cout<<a<<"^"<<b<<endl;
return (int)(a^b);
break;
}
case'&':{
//cout<<a<<"&"<<b<<endl;
return (int)(a&b);
break;
}
case'|':{
//cout<<a<<"|"<<b<<endl;
return (int)(a|b);
break;
}
}
}
int main(){
char arr[7]={'+','-','*','/','^','&','|'};
string s;cin>>s;
sort(s.begin(), s.end());
while(next_permutation(s.begin(),s.end())){
//cout<<s<<endl;
// s[0] s1 s2 s3
// ((A @ B) @ C) @ D
// (A @ B) @ (C @ D)
// (A @ (B @ C)) @ D
// A @ ((B @ C) @ D)
// A @ (B @ (C @ D))
int a[3];
for(int i=0;i<4;i++){
switch(s[i]){
case'A':{
a[i]=1;
break;
}
case'T':{
a[i]=10;
break;
}
case'J':{
a[i]=11;
break;
}
case'Q':{
a[i]=12;
break;
}
case'K':{
a[i]=13;
break;
}
default:{
a[i]=s[i]-48;
break;
}
}
}
//for(int i=0;i<4;i++)cout<<a[i]<<" ";cout<<endl;
for(int i=0;i<7;i++)
for(int j=0;j<7;j++)
for(int k=0;k<7;k++){
if(calc(calc(calc(a[0],a[1],arr[i]),a[2],arr[j]),a[3],arr[k])==24){
string ansstr="";
ansstr=ansstr+"((("+s[0]+arr[i]+s[1]+")"+arr[j]+s[2]+")"+arr[k]+s[3]+")";
//cout<<ansstr<<endl;
ans.push_back(ansstr);
}
if(calc(calc(a[0],a[1],arr[i]),calc(a[2],a[3],arr[k]),arr[j])==24){
string ansstr="";
ansstr=ansstr+"(("+s[0]+arr[i]+s[1]+")"+arr[j]+"("+s[2]+arr[k]+s[3]+"))";
//cout<<ansstr<<endl;
ans.push_back(ansstr);
}
if(calc(a[3],calc(a[0],calc(a[1],a[2],arr[j]),arr[i]),arr[k])==24){
string ansstr="";
ansstr=ansstr+"(("+s[0]+arr[i]+"("+s[1]+arr[j]+s[2]+"))"+arr[k]+s[3]+")";
//cout<<ansstr<<endl;
ans.push_back(ansstr);
}
if(calc(a[0],calc(a[3],calc(a[1],a[2],arr[j]),arr[k]),arr[i])==24){
string ansstr="";
ansstr=ansstr+"("+s[0]+arr[i]+"(("+s[1]+arr[j]+s[2]+")"+arr[k]+s[3]+"))";
//cout<<ansstr<<endl;
ans.push_back(ansstr);
}
// A @ (B @ (C @ D))
//(a[0]arr[i](a[1]arr[j](a[2]arr[k]a[3])))
if(calc(calc(calc(a[2],a[3],arr[k]),a[1],arr[j]),a[0],arr[i])==24){
string ansstr="";
ansstr=ansstr+"("+s[0]+arr[i]+"("+s[1]+arr[j]+"("+s[2]+arr[k]+s[3]+")))";
//cout<<ansstr<<endl;
ans.push_back(ansstr);
}
}
}
sort(ans.begin(),ans.end());
cout<<ans[0];
}
E. 生日购物
#include<iostream>
#include<stdio.h>
#include<vector>
#include<list>
using namespace std;
list<int> list1;
vector<int>ans;
void GetNSum(vector<int>a,int k, int n)
{
if(k == a[n-1])
{
list<int>::iterator it;
for(it = list1.begin();it!=list1.end();it++)
{
//cout<<*it<<" ";
ans.push_back(*it);
}
//cout<<a[n-1]<<endl;
return;
}
else if(n<=0) return;
else
{
GetNSum(a,k,n-1);
//---------------------------
list1.push_front(a[n-1]);
GetNSum(a,k-a[n-1],n-1);
list1.pop_front();
}
}
int main()
{
int n,x;
while(scanf("%d %d",&n,&x)!=EOF){
vector<int>a;
for(int i=0;i<n;i++){
int x;cin>>x;
a.push_back(x);
}
GetNSum(a,x,n);
if(ans.empty())cout<<"NO"<<endl;
else cout<<"YES"<<endl;
ans.clear();
}
}