codevs1116

题目连接:http://codevs.cn/problem/1116/

这道题也是一道深搜的题   思路就是从第一个点开始搜索然后进行判断看这个颜色能不能添如果能添就继续下一个点   一样解释在代码中写了很多 下面看代码

#include<stdio.h>
#include<string.h>
int n;
struct node
{
    int num;     //这个是看这个点是第几个点
    int color;   //看这个点用的什么颜色
}a[10];
int mark[10][10]; //看哪个点和哪个点不能填一样的
int sum = 0;    //记录方法的数量

void dfs(int x,int y)
{
    if(x > y)
    {
        sum++;
        return ;
    }
    else
    {

    }
    for(int i = 1;i <= 4;i++)
    {
        int flag = 0;
        for(int j = 1;j <= y;j++)
        {
            if(mark[j][x] == 1&&i == a[j].color)   //判断这个颜色能不能填
                {
                    flag = 1;
                    break;
                }
        }
        if(flag == 1)
        {
            continue;
        }
        else
        {
            a[x].color = i;
            dfs(x + 1,y);
            a[x].color = 0;  //这个地方别忘了 不然就会没有几种方法
        }
    }

}

int main()

{
    scanf("%d",&n);
    for(int i = 0;i <= 10;i++)
    {
        a[i].num = i;
        a[i].color = 0;
    }
    for(int i = 1;i <= n;i++)
    {
        for(int j = 1;j <= n;j++)
        {
            scanf("%d",&mark[i][j]);
           // printf("%d ",mark[i][j]);
        }
    }
    dfs(1,n);
    printf("%d\n",sum);
}
时间: 2024-12-24 12:32:50

codevs1116的相关文章

搜索复习-基础水题

tyvj1080 N皇后 描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 列号  1  2  3  4  5  6 ------------------------- 1 |  | O |  |  |  |  | ------------------------- 2 |  |  |  | O |  |  | ------------------------- 3 |  |  |  |  |