main では a[x][y]、can_choose では a[y][x] になっています。
can_choose の 3つめの for文の y<0 は常に成立しません。
solve も変です。boad[x][y] = queen; はしているのに、
non に戻す処理がありません。
ということで、書き直してみました。
C
1#include<stdio.h>23#defineN845enum{ queen =1, non =0};67intoutput(int a[N][N])8{9for(int i =0; i < N; i++){10for(int j =0; j < N; j++){11if(a[i][j]== non)printf(" *");12elseprintf(" Q");13}14putchar('\n');15}16putchar('\n');17return0;18}1920intcan_choose(int a[N][N],int i,int j)21{22int x, y;2324for(x = i -1, y = j -1; x >=0&& y >=0; x--, y--)25if(a[x][y]== queen)return0;2627for(x = i -1, y = j; x >=0; x--)28if(a[x][y]== queen)return0;2930for(x = j -1, y = i +1; x >=0&& y < N; x--, y++)31if(a[x][y]== queen)return0;3233return1;34}3536intsolve(int board[N][N],int x)37{38if(x == N)39output(board);40else{41for(int y =0; y < N; y++){42if(can_choose(board, x, y)){43 board[x][y]= queen;44solve(board, x +1);45 board[x][y]= non;46}47}48}49}5051intmain(void)52{53int board[N][N];54for(int x =0; x < N; x++){55for(int y =0; y < N; y++){56 board[x][y]= non;57}58}59solve(board,0);60return0;61}
1#include<stdio.h>23#defineN845voidoutput(int a[])6{7for(int i =0; i < N; i++){8for(int j =1; j <= N; j++){9if(a[i]== j)printf(" Q");10elseprintf(" *");11}12putchar('\n');13}14putchar('\n');15}1617intcan_choose(int a[],int x,int y)18{19for(int i = x -1, p =1; i >=0; i--, p++)20if(a[i]== y || a[i]- p == y || a[i]+ p == y)return0;21return1;22}2324voidsolve(int board[],int x)25{26if(x == N)27output(board);28else{29for(int y =1; y <= N; y++){30if(can_choose(board, x, y)){31 board[x]= y;32solve(board, x +1);33 board[x]=0;34}35}36}37}3839intmain(void)40{41int board[N]={0};42solve(board,0);43}
追記2
can_choose の 3番目の for文が間違っていました。
次のように訂正します。
diff
1- for (x = j - 1, y = i + 1; x >= 0 && y < N; x--, y++)
2+ for (x = i - 1, y = j + 1; x >= 0 && y < N; x--, y++)
追記3
別解の can_choose をちょっと変更。
diff
1- for (int i = x - 1, p = 1; i >= 0; i--, p++)
2- if (a[i] == y || a[i] - p == y || a[i] + p == y) return 0;
3+ for (int p = 1; --x >= 0; p++)
4+ if (a[x] == y || a[x] - p == y || a[x] + p == y) return 0;
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。