| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
朴素DFS的孩子们,多加几个return就行了,500ms#include<stdio.h>
#include<string.h>
int map[17][301];
int rn[17];
int cn[301];
bool is_useful[17];
bool flag;
int M,N;
int i,j;
int tn[301];
void dfs(int depth, int total)
{
if(flag)return;//has found
if(total == N) //found!!
{
flag = true;
return;
}
if(depth == M)return;
if(!is_useful[depth]) //rn[depth] = 0
{
dfs(depth+1,total);
return;
}
if(total + rn[depth] > N)//not ok
{
dfs(depth+1,total);
return;
}
for(i=0;i<N;i++)
{
if(tn[i] !=0 && map[depth][i] !=0)//more than one 1
{
dfs(depth+1,total);
return;
}
}
//dont use the row
dfs(depth+1,total);
if(flag)return;//has found
//use the row
for(i=0;i<N;i++)
tn[i] += map[depth][i];
dfs(depth+1,total+rn[depth]);
for(i=0;i<N;i++)
tn[i] -= map[depth][i];
}
int main()
{
int i,j;
while(scanf("%d%d",&M,&N) != EOF)
{
for(i=0;i<M;i++)
{
rn[i]=0;
is_useful[i]=true;
}
for(i=0;i<N;i++)
{
cn[i]=0;
tn[i]=0;
}
flag = false;
for(i=0;i<M;i++)
for(j=0;j<N;j++)
{
scanf("%d",&map[i][j]);
if(map[i][j]!=0)
{
rn[i]++;
cn[j]++;
}
}
//if a rown == 0 then the row is useless
for(i=0;i<M;i++)
if(rn[i]==0)is_useful[i]=false;
//if a coln == 0 then impossible
for(i=0;i<N;i++)if(cn[i]==0)break;
if(i!=N)
{
printf("It is impossible\n");
continue;
}
dfs(0,0);
if(flag)
printf("Yes, I found it\n");
else
printf("It is impossible\n");
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator