1.opj2815城の問題
アイデア:1248の数値は&演算子あなたが統一マークを通じて部屋に行くことができるかどうかを判断することができたと城は、隣接行列として保存されます。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int room[60][60];
int color[60][60];
int num=0,area=0;
int r,c;
int maxarea=0;
void dfs(int i,int j)
{
if(color[i][j])return;
++area;
color[i][j]=num;
if((room[i][j]&1)==0)dfs(i,j-1);
if((room[i][j]&2)==0)dfs(i-1,j);
if((room[i][j]&4)==0)dfs(i,j+1);
if((room[i][j]&8)==0)dfs(i+1,j);
}
int main()
{
cin>>r>>c;
memset(color,0,sizeof(color));
for (int i = 0; i < r; ++i)
for(int j = 0; j < c; ++j)
cin>>room[i][j];
for(int i=0;i<r;++i)
for(int j=0;j<c;++j)
{
if(!color[i][j])
{
++num;area=0;
dfs(i,j);
maxarea=max(maxarea,area);
}
}
cout<<num<<endl<<maxarea;
return 0;
}
2.openj4103ステップ四角
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int color[100][100];
int n;
int dfs(int i,int j,int n)
{
if(n==0)return 1;
color[i][j]=1;
int num=0;
if(!color[i][j-1])num+=dfs(i,j-1,n-1);
if(!color[i-1][j])num+=dfs(i-1,j,n-1);
if(!color[i][j+1])num+=dfs(i,j+1,n-1);
color[i][j]=0;
return num;
}
int main()
{
cin>>n;
memset(color,0,sizeof(color));
cout<<dfs(50,50,n)<<endl;
return 0;
}
ディープ検索の概要:1のウォークスルーすることはできません。
uva524
#include <iostream>
#include <cstdio>
#include <cstring>
#include <math.h>
using namespace std;
const int maxn=100;
int vis[maxn],A[maxn];
int n;
int isp[maxn];
int is_primer(int n)
{
int flag=1;
for(int i=2;i<sqrt(n)+1;++i)
{
if(n%i==0){flag=0;break;}
}
if(flag)return n;
else return 0;
}
void dfs(int cur)
{
if(cur==n+1&&isp[A[1]+A[n]])
{
cout<<A[1];
for(int i=2;i<=n;++i)cout<<" "<<A[i];
cout<<endl;
}
else for(int i=2;i<=n;++i)
{
if(!vis[i]&&isp[i+A[cur-1]])
{
A[cur]=i;
vis[i]=1;
dfs(cur+1);
vis[i]=0;
}
}
}
int main()
{
int kase=0;
while(cin>>n&&n)
{
if(kase)cout<<endl;
printf("Case %d:\n",++kase);
for(int i=0;i<2*n;++i)
{
isp[i]=is_primer(i);
}
memset(A,0,sizeof(A));
memset(vis,0,sizeof(vis));
A[1]=1;
dfs(2);
}
return 0;
}