A 棋盘问题
#include <stdio.h>
#include <string.h>
char s[10][10];
int n,m,h=0;
int b[10];
void dfs(int k,int j)
{
if(j==m){
h++;
return;
}
for(int i=k;i<n;i++){
for(int l=0;l<n;l++){
if(b[l]==0&&s[i][l]=='#')
{
b[l]=1;
dfs(i+1,j+1);
b[l]=0;
}
}
}
return;
}
int main()
{
while(1){
scanf("%d %d",&n,&m);
if(n==-1&&m==-1) break;
getchar();
for(int i=0;i<n;i++){
for(int l=0;l<n;l++){
scanf("%c",&s[i][l]);
}
getchar();
}
for(int i=0;i<=n;i++){
b[i]=0;
}
h=0;
dfs(0,0);
printf("%d\n",h);
}
return 0;
}
B Perket
#include <stdio.h>
#include <string.h>
#include <math.h>
int n,min,aa=1,bb=0;
int b[12],a[12],c[12]={0};
void dfs(int k)
{
int m,a1=aa,b1=bb;
for(int i=k;i<n;i++)
{
if(c[i]==0)
{
c[i]=1;
aa=aa*a[i],bb=bb+b[i];
m=abs(aa-bb);
if(m<min) min=m;
dfs(i+1);
c[i]=0;
aa=a1,bb=b1;
}
}
return;
}
int main()
{
scanf("%d\n",&n);
for(int i=0;i<n;i++)
{
scanf("%d %d",&a[i],&b[i]);
}
min=abs(a[0]-b[0]);
dfs(0);
printf("%d\n",min);
return 0;
}
C 全排列
#include <stdio.h>
#include <string.h>
char s[10];
int n,a[10]={0},b[10]={0};
void dfs(int k){
if(k>n){
for(int i=1;i<=n;i++){
printf("%c",s[a[i]-1]);
}
printf("\n");
}
for(int i=1;i<=n;i++){
if(b[i]==0&&k<=n){
a[k]=i;
b[i]=1;
dfs(k+1);
b[i]=0;
}
}
}
int main()
{
int k=1;
scanf("%s",s);
n=strlen(s);
dfs(k);
return 0;
}
D 自然数拆分
#include<stdio.h>
int n,m, s[1100]={1};
void dfs(int a){
for(int i=s[a-1]; i<=m; i++){
if(i==n) continue;
s[a]=i;
m-=i;
if(m==0){
printf("%d=",n);
for(int j=1; j<a; j++){
printf("%d+",s[j]);
}
printf("%d\n",s[a]);
}else{
dfs(a+1);
}
m+=i;
}
}
int main()
{
scanf("%d",&n);
m=n;
dfs(1);
return 0;
}
E Prime Ring Problem
#include<stdio.h>
#include<string.h>
int n,k=1,a[17]={0},b[17];
int s[10]={3,5,7,11,13,17,19,23,29,31};
void sc(){
for(int i=1;i<=n;i++){
printf("%d",b[i]);
if(i<n) printf(" ");
}
printf("\n");
return;
}
void DFS(int x){
if(x>n) return;
for(int i=2;i<=n;i++){
if(a[i]==0){
a[i]=1;
for(int j=0;j<10;j++){
if(i+b[x-1]==s[j]){
b[x]=i;
int c=b[n]+b[1];
if(x==n&&c%2!=0){
if(c==3) sc();
else if(c%3!=0) sc();
}
DFS(x+1);
break;
}
}
a[i]=0;
}
}
return;
}
int main()
{
while(scanf("%d",&n)!=EOF){
if(k!=1) printf("\n");
printf("Case %d:\n",k);
for(int i=0;i<=n;i++){
b[i]=1;
}
if(n==1) printf("1\n");
else DFS(2);
k++;
}
return 0;
}
F Red and Black
#include<stdio.h>
char a[25][25];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int x,y,num;
int YES(int x0,int y0)
{
if(x0<y&&x0>=0&&y0>=0&&y0<x)
return 1;
else
return 0;
}
void DFS(int x0,int y0)
{
a[x0][y0]='#';
num++;
int xx,yy;
for(int i=0; i<4; i++)
{
int xx=x0+dir[i][0];
int yy=y0+dir[i][1];
if(YES(xx,yy)==1&&a[xx][yy]=='.')
DFS(xx,yy);
}
}
int main()
{
int i,j,di,dj;
while (scanf("%d%d",&x,&y)!=EOF)
{
getchar();
if (x==0&&y==0) break;
for (i=0; i<y; i++)
{
for (j=0; j<x; j++)
{
scanf("%c",&a[i][j]);
if(a[i][j] == '@')
{
di = i;
dj = j;
}
}
getchar();
}
num=0;
DFS(di,dj);
printf("%d\n",num);
}
return 0;
}