题目连接: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);
}