程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> poj 2870 Light Up 暴力搜索 + 剪枝

poj 2870 Light Up 暴力搜索 + 剪枝

編輯:C++入門知識

看了半天題目,原以為有什麼高深的方法,沒想到最後暴力加了個關鍵的剪枝就過了,囧,不過還是TLE了很多次。。。。。。
[cpp]
#include <cstdio>  
#include <cstring>  
#include <algorithm>  
using namespace std; 
int mp[10][10]; 
int n , m , lim; 
bool den[10][10]; 
bool valid(int x,int y) 

    return x>=1 && x<=n && y>=1 && y<=m; 

bool check() 

    for(int i = 1; i <= n; i++) 
    { 
        for(int j = 1; j <= m; j++) 
        { 
            if(mp[i][j] == -2)return false; 
            if(mp[i][j]>=1 && mp[i][j] <= 4) return false; 
        } 
    } 
    return true; 

int dir[4][2] = {1,0,0,1,-1,0,0,-1}; 
bool canput(int x,int y) 

    for(int i = 0; i < 4; i++) 
    { 
        int tx = x + dir[i][0]; 
        int ty = y + dir[i][1]; 
        if(valid(tx,ty)) 
        { 
            if( mp[tx][ty] == 0 ) return false; 
        } 
    } 
    return true; 

void go(int x,int y) 

    if(mp[x][y]==-2) 
    { 
        mp[x][y] = 5; 
        return ; 
    } 
    if(mp[x][y]>=5)    mp[x][y]++; 

void gao(int x,int y) 

    for(int i = 0; i < 4; i++) 
    { 
        int tx = x + dir[i][0]; 
        int ty = y + dir[i][1]; 
        if(valid(tx,ty)) 
        { 
            if(mp[tx][ty]>=1 && mp[tx][ty]<=4)    mp[tx][ty] --; 
        } 
    } 
    for(int i=y+1;i<=m;i++) 
    { 
        go(x,i); 
        if(mp[x][i]>=-1 && mp[x][i] <= 4) break; 
    } 
    for(int i=y-1;i>=1;i--) 
    { 
        go(x,i); 
        if(mp[x][i]>=-1 && mp[x][i] <= 4) break; 
    } 
    for(int i=x-1;i>=1;i--) 
    { 
        go(i,y); 
        if(mp[i][y]>=-1 && mp[i][y] <= 4) break; 
    } 
    for(int i=x+1;x<=n;i++) 
    { 
        go(i,y); 
        if(mp[i][y]>=-1 && mp[i][y] <= 4) break; 
    } 

void Go(int x,int y) 

    if(mp[x][y]==5)    mp[x][y] = -2; 
    if(mp[x][y]> 5)    mp[x][y] -- ; 

void clear(int x,int y) 

    for(int i = 0; i < 4; i++) 
    { 
        int tx = x + dir[i][0]; 
        int ty = y + dir[i][1]; 
        if(valid(tx,ty)) 
        { 
            if(mp[tx][ty]>=0 && mp[tx][ty]<=3)    mp[tx][ty] ++; 
        } 
    } 
    for(int i=y+1;i<=m;i++) 
    { 
        Go(x,i); 
        if(mp[x][i]>=-1 && mp[x][i] <= 4) break; 
    } 
    for(int i=y-1;i>=1;i--) 
    { 
        Go(x,i); 
        if(mp[x][i]>=-1 && mp[x][i] <= 4) break; 
    } 
    for(int i=x-1;i>=1;i--) 
    { 
        Go(i,y); 
        if(mp[i][y]>=-1 && mp[i][y] <= 4) break; 
    } 
    for(int i=x+1;x<=n;i++) 
    { 
        Go(i,y); 
        if(mp[i][y]>=-1 && mp[i][y] <= 4) break; 
    } 

int ans; 
void dfs(int dep,int x,int y)  

    if(dep>ans) return ; 
    if(x>n)  
    { 
        if(check()) 
        { 
            if(dep<ans) ans=dep;  
        } 
        return ; 
    } 
    if(x>1 && mp[x-1][y]==-2 && mp[x][y]>=-1&&mp[x][y]<=4 ) return ; 
    if(y<m) dfs(dep,x,y+1); 
    else dfs(dep,x+1,1); 
    if(mp[x][y]==-2) 
    { 
        if(canput(x,y))  
        { 
            den[x][y] = true; 
            mp[x][y] = 5; 
            gao(x,y); 
            if(y<m) dfs(dep+1,x,y+1); 
            else dfs(dep+1,x+1,1); 
            den[x][y]=false; 
            mp[x][y] = -2; 
            clear(x,y); 
        } 
    } 

int main() 

    int b , r , c , k ; 
    while(scanf("%d%d",&n,&m),n||m) 
    { 
        for(int i = 1; i <= n; i++) 
        { 
            for(int j = 1; j <= m; j++) 
            { 
                mp[i][j] = - 2; 
            } 
        } 
        scanf("%d",&b); 
        for(int i = 0; i < b; i++) 
        { 
            scanf("%d%d%d",&r,&c,&k); 
            mp[r][c] = k; 
        } 
        ans = 1000; 
        dfs(0,1,1); 
        if(ans<1000)  printf("%d\n",ans); 
        else puts("No solution"); 
    } 
    return 0; 

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int mp[10][10];
int n , m , lim;
bool den[10][10];
bool valid(int x,int y)
{
 return x>=1 && x<=n && y>=1 && y<=m;
}
bool check()
{
 for(int i = 1; i <= n; i++)
 {
  for(int j = 1; j <= m; j++)
  {
   if(mp[i][j] == -2)return false;
   if(mp[i][j]>=1 && mp[i][j] <= 4) return false;
  }
 }
 return true;
}
int dir[4][2] = {1,0,0,1,-1,0,0,-1};
bool canput(int x,int y)
{
 for(int i = 0; i < 4; i++)
 {
  int tx = x + dir[i][0];
  int ty = y + dir[i][1];
  if(valid(tx,ty))
  {
   if( mp[tx][ty] == 0 ) return false;
  }
 }
 return true;
}
void go(int x,int y)
{
 if(mp[x][y]==-2)
 {
  mp[x][y] = 5;
  return ;
 }
 if(mp[x][y]>=5)    mp[x][y]++;
}
void gao(int x,int y)
{
 for(int i = 0; i < 4; i++)
 {
  int tx = x + dir[i][0];
  int ty = y + dir[i][1];
  if(valid(tx,ty))
  {
   if(mp[tx][ty]>=1 && mp[tx][ty]<=4) mp[tx][ty] --;
  }
 }
 for(int i=y+1;i<=m;i++)
 {
  go(x,i);
  if(mp[x][i]>=-1 && mp[x][i] <= 4) break;
 }
 for(int i=y-1;i>=1;i--)
 {
  go(x,i);
  if(mp[x][i]>=-1 && mp[x][i] <= 4) break;
 }
 for(int i=x-1;i>=1;i--)
 {
  go(i,y);
  if(mp[i][y]>=-1 && mp[i][y] <= 4) break;
 }
 for(int i=x+1;x<=n;i++)
 {
  go(i,y);
  if(mp[i][y]>=-1 && mp[i][y] <= 4) break;
 }
}
void Go(int x,int y)
{
 if(mp[x][y]==5)    mp[x][y] = -2;
 if(mp[x][y]> 5)    mp[x][y] -- ;
}
void clear(int x,int y)
{
 for(int i = 0; i < 4; i++)
 {
  int tx = x + dir[i][0];
  int ty = y + dir[i][1];
  if(valid(tx,ty))
  {
   if(mp[tx][ty]>=0 && mp[tx][ty]<=3) mp[tx][ty] ++;
  }
 }
 for(int i=y+1;i<=m;i++)
 {
  Go(x,i);
  if(mp[x][i]>=-1 && mp[x][i] <= 4) break;
 }
 for(int i=y-1;i>=1;i--)
 {
  Go(x,i);
  if(mp[x][i]>=-1 && mp[x][i] <= 4) break;
 }
 for(int i=x-1;i>=1;i--)
 {
  Go(i,y);
  if(mp[i][y]>=-1 && mp[i][y] <= 4) break;
 }
 for(int i=x+1;x<=n;i++)
 {
  Go(i,y);
  if(mp[i][y]>=-1 && mp[i][y] <= 4) break;
 }
}
int ans;
void dfs(int dep,int x,int y)
{
 if(dep>ans) return ;
 if(x>n)
 {
  if(check())
  {
   if(dep<ans) ans=dep; 
  }
  return ;
 }
 if(x>1 && mp[x-1][y]==-2 && mp[x][y]>=-1&&mp[x][y]<=4 ) return ;
 if(y<m) dfs(dep,x,y+1);
 else dfs(dep,x+1,1);
 if(mp[x][y]==-2)
 {
  if(canput(x,y))
  {
   den[x][y] = true;
   mp[x][y] = 5;
   gao(x,y);
   if(y<m) dfs(dep+1,x,y+1);
   else dfs(dep+1,x+1,1);
   den[x][y]=false;
   mp[x][y] = -2;
   clear(x,y);
  }
 }
}
int main()
{
 int b , r , c , k ;
 while(scanf("%d%d",&n,&m),n||m)
 {
  for(int i = 1; i <= n; i++)
  {
   for(int j = 1; j <= m; j++)
   {
    mp[i][j] = - 2;
   }
  }
  scanf("%d",&b);
  for(int i = 0; i < b; i++)
  {
   scanf("%d%d%d",&r,&c,&k);
   mp[r][c] = k;
  }
  ans = 1000;
  dfs(0,1,1);
  if(ans<1000)  printf("%d\n",ans);
  else puts("No solution");
 }
 return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved