hdu1045+bfs Fire Net

来源:互联网 发布:网络设备端口流量统计 编辑:程序博客网 时间:2024/04/29 14:08

大概思路 就是dfs去遍历每个格子 去当前位置每行每列去放在模块 当放置一个模块的时候 去判断这一行这一列是否有已经放置过的模块 直至全部遍历

AC代码

import java.util.Scanner;public class Main{    /**     * @param args     */    static int n;    static char map[][]=new char[5][5];    static int dx[] = {1,-1,0,0};    static int dy[] = {0,0,1,-1};    static int max;    public static void main(String[] args) {        // TODO Auto-generated method stub        Scanner scan=new Scanner(System.in);            while((n=scan.nextInt())>0){            for(int i=0;i<n;i++){                String str=scan.next();                char a[]=str.toCharArray();                for(int j=0;j<a.length;j++){                    map[i][j]=a[j];                }            }            max=0;            dfs(0);//遍历            System.out.println(max);        }    }    private static void dfs(int ans) {        // TODO Auto-generated method stub        for(int i=0;i<n;i++){            for(int j=0;j<n;j++){                if(ok(i,j)){//去判断当前位置是否可以放置模块                    map[i][j]='1';                    dfs(ans+1);                    map[i][j]='.';//回溯                }            }            if(max<ans){                max=ans;            }        }    }    private static boolean ok(int x, int y) {        // TODO Auto-generated method stub        int x1,y1;        if(map[x][y]!='.')            return false;        for(int i=0;i<4;i++){            x1=x+dx[i];            y1=y+dy[i];            while(true){                if(x1<0||y1<0||x1>=n||y1>=n||map[x1][y1]=='X')                    break;                else if(map[x1][y1]=='1'){                    return false;                }                x1+=dx[i];                y1+=dy[i];            }        }        return true;    }}
原创粉丝点击